Olá pessoal. Estou com uma dúvida cruel no Hibernate. Leio em vários lugares que a definição de FetchType.EAGER faz o relacionamento (tanto único quanto coleção) ser carregado de uma vez no primeiro select. O problema é que eu só consigo reproduzir isso utilizando join fetch. Se eu usar somente FetchType.EAGER ele faz dois selects de uma vez ao invés de um.
@Entity
public class Movimentacao {
@Id
@GeneratedValue
private Integer id;
@ManyToOne // padrão EAGER
private Conta conta;
EntityManager em = new JPAUtil().getEntityManager();
List<Movimentacao> lista = new MovimentacaoDAO(em).lista();
em.close();
System.out.println("------------lista Carregada--------------");
for (Movimentacao movimentacao : lista) {
System.out.println(movimentacao.getConta());
}
Neste caso: 1 select para a lista e 1 para cada conta.
Hibernate:
select
movimentac0_.id as id1_,
movimentac0_.conta_id as conta6_1_,
movimentac0_.data as data1_,
movimentac0_.descricao as descricao1_,
movimentac0_.tipoMovimentacao as tipoMovi4_1_,
movimentac0_.valor as valor1_
from
Movimentacao movimentac0_
Hibernate:
select
conta0_.id as id0_0_,
conta0_.agencia as agencia0_0_,
conta0_.banco as banco0_0_,
conta0_.numero as numero0_0_,
conta0_.titular as titular0_0_
from
Conta conta0_
where
conta0_.id=?
Hibernate:
select
conta0_.id as id0_0_,
conta0_.agencia as agencia0_0_,
conta0_.banco as banco0_0_,
conta0_.numero as numero0_0_,
conta0_.titular as titular0_0_
from
Conta conta0_
where
conta0_.id=?
------------lista Carregada--------------
br.com.caelum.financas.modelo.Conta@11b72b5
br.com.caelum.financas.modelo.Conta@148c8a0