Bom, se eu tenho uma classe Funcionario que possue um objeto Pessoafisica, mas no createQuery do entityManager eu faço: “SELECT c FROM br.com.projeto.bean.Funcionario c”. Mesmo se eu botar o pessoaFisica com o EAGER ele não carrega.
Porém se eu mudar a query para “SELECT c FROM br.com.projeto.bean.Funcionario c JOIN FETCH c.pessoaFisica” ele carrega todos os atributos de pessoaFisica.
Certo, mas então pra que usar o EAGER e LAZY se eu tenho que dizer explicitamente pelo FETCH ?
[quote=rlanhellas]Bom, se eu tenho uma classe Funcionario que possue um objeto Pessoafisica, mas no createQuery do entityManager eu faço: “SELECT c FROM br.com.projeto.bean.Funcionario c”. Mesmo se eu botar o pessoaFisica com o EAGER ele não carrega.
Porém se eu mudar a query para “SELECT c FROM br.com.projeto.bean.Funcionario c JOIN FETCH c.pessoaFisica” ele carrega todos os atributos de pessoaFisica.
Certo, mas então pra que usar o EAGER e LAZY se eu tenho que dizer explicitamente pelo FETCH ?[/quote]
Se toda vida no sistema voce precisar de PessoaFisica carregada ao ler Funcionario entao deixe EAGER no mapeamento, senão faça o fetch na query, isso tudo afim de gerar um único SQL. O mais comum é deixar lazy no mapeamento e resolver o fetch na query de acordo com cada caso de consulta.
Obrigado javaflex, agora entendi a utilidade disso.
Mas surgi aqui uma dúvida: Tenho um método padrão que recebe uma Classe e carrega a query para essa classe sempre em LAZY, veja abaixo:
@Transactional(readOnly = true)
public List<? extends AbstractBean> findAll(Class beanClass) {
Query query = entityManager.createQuery("SELECT c FROM " + beanClass.getName() + " c");
return query.getResultList();
}
Porém, uso Primefaces DataTable e em algum momento vou precisar alguns objetos dentro do objeto (como é o caso da PessoaFisica dentro de Funcionario). Eu teria que fazer uma Query só para carregar com EAGER ?
Para melhor otimização sim, mas se não for custoso na prática em produção ter mais um SQL executado separado em determinado momento, então apenas leia Funcionario e navegue até PessoaFisica. Não sei como está seu mapeamento, mas supondo que seria ler “funcionario.PessoaFisica”. Tudo é bom senso.