Venho mais uma vez pedir auxilio aos Srs., dessa vez gostaria de esclarecimentos do comportamento de um relacionamento hibernate.
Considere o seguinte cenário:
Pedido tem um relacionamento unidirecional para Conta, com isso precisei gerar uma tabela extra então mapeei a tal tabela e a chamei de PedidoConta
Pedido também tem um relacionamento com ItemPedido OneToMany
Logo tiramos a conclusão de que Pedido também tem um relacionamento OneToMany com PedidoConta
Resolvi deixar todos os relacionamentos com fetch=FetchType.LAZY mas tive a idéia de colocar apenas o relacionamento de Pedido com ItemPedido como fetch=FetchType.EAGER ai surgiu o problema, o que o banco me traz são pedidos duplicados, mesmo eu tendo apenas 1 pedido no banco ele me traz 2 pedidos sendo que os 2 objetos Pedido que é trazido do banco são os mesmos objetos (Mesma Referência), será que consigo uma explicação lógica para isso ? Como resolver ?
Classe Pedido
@Id
@SequenceGenerator(name="generator_pedido", sequenceName="gen_pedido")
@GeneratedValue(generator="generator_pedido")
@Column(name="pedi_id", nullable=false)
private int pedi_id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="pess_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Pessoa pessoa;
@Column(name="pedi_tipo", length=50, nullable=false)
private int pedi_tipo;
@OneToMany(mappedBy="pedido", fetch=FetchType.LAZY)
@Cascade(CascadeType.ALL)
private List<ItemPedido> itempedido;
@Column(name="pedi_dtemissao", nullable=false)
@Temporal(TemporalType.DATE)
private Date pedi_dtemissao;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="usua_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Usuario usuario;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="empe_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Empresa empresa;
@OneToMany(mappedBy="pedido",fetch=FetchType.LAZY)
@Cascade(CascadeType.ALL)
private List<PedidoConta> pedidoconta;
Classe PedidoConta
@Id
@SequenceGenerator(name="generator_pedidoconta", sequenceName="gen_pedidoconta")
@GeneratedValue(generator="generator_pedidoconta")
@Column(name="peco_id", nullable=false)
private int peco_id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="pedi_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Pedido pedido;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="cota_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.ALL)
private Conta conta;
Classe Conta
@Id
@SequenceGenerator(name="generator_conta", sequenceName="gen_conta")
@GeneratedValue(generator="generator_conta")
@Column(name="cota_id", nullable=false)
private int cota_id;
@Column(name="cota_tipo", length=1, nullable=false)
private int cota_tipo;
@Column(name="cota_dtlancamento", nullable=false)
@Temporal(TemporalType.DATE)
private Date cota_dtlancamento;
@Column(name="cota_dtvencimento", nullable=false)
@Temporal(TemporalType.DATE)
private Date cota_dtvencimento;
@Column(name="cota_valor", precision=2, nullable=false)
private Double cota_valor;
@Column(name="cota_status", length=1, nullable=false)
private int cota_status;
@OneToMany(mappedBy="conta")
@Cascade(CascadeType.ALL)
private List<ContaAnotacao> contaanotacao;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="coca_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private ContaCaixa contacaixa;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="pess_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Pessoa pessoa;
@Column(name="cota_descricao", length=200, nullable=true)
private String cota_descricao;
@Column(name="cota_parcela", length=15, nullable=false)
private String cota_parcela;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="usua_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Usuario usuario;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="empe_id", updatable=true, insertable=true)
@Fetch(FetchMode.JOIN)
private Empresa empresa;
Lembrando que conta não tem relação com ninguém e o problema acontece quando eu mudo
@OneToMany(mappedBy="pedido", fetch=FetchType.LAZY)
@Cascade(CascadeType.ALL)
private List<ItemPedido> itempedido;
para isso
@OneToMany(mappedBy="pedido", fetch=FetchType.EAGER)
@Cascade(CascadeType.ALL)
private List<ItemPedido> itempedido;
