Hibernate fetch=FetchType.LAZY e fetch=FetchType.EAGER

17 respostas
cristianovieira

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;

17 Respostas

Rodrigo_Sasaki

Faltou postar a entidade ItemPedido

cristianovieira

Segue a classe ItemPedido como solicitado

@Id
	@SequenceGenerator(name="generator_itempedido", sequenceName="gen_itempedido")	 
    @GeneratedValue(generator="generator_itempedido")
 	@Column(name="itpe_id", nullable=false)
	private int itpe_id;
	 
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="prod_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
	private Produto produto;
	 
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="pedi_id", updatable=true, insertable=true)
    @Fetch(FetchMode.JOIN)
    private Pedido pedido; 
    
    @Column(name="itpe_qtd", length=5, nullable=false)
    private int itpe_qtd;
	 
    @Column(name="itpe_peso", precision=1, nullable=false)
    private Double itpe_peso;
	 
    @Column(name="itpe_valor", precision=2, nullable=false)
    private Double itpe_valor;
	 
    @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;
Rodrigo_Sasaki

Minha teoria:

Pensando só logicamente aqui, quando o FetchType é Eager, ele vai trazer o objeto completo pra você, com tudo inicializado, ou seja, pra cada ItemPedido ele vai buscar o Pedido pra você, e sendo que você busca pelo Pedido, cada ItemPedido relacionado a ele, irá trazer o mesmo Pedido, entendeu?

assim:

Você busca o Pedido 1, e o Pedido 1 tem 2 ItemPedidos
Cada um desses ItemPedido (Por ser Eager), irá buscar o Pedido relacionado a ele, que no caso é o mesmo.

cristianovieira

Correto, eu entendi a explicação perfeitamente, o que eu não concordo é que mesmo que ItemPedido busque o pedido relacionado a ele deveria ficar tudo dentro da list de ItemPedido e não duplicar a entidade Pai que neste caso é Pedido. Levando em conta também o seguinte:

1º Todo relacionamento OneToMany com eager iria repetir a entidade Pai
2º Experimentei tirar o relacionamento de ItemPedido para ItemConta e não duplicou

Foi ótima a sua abordagem com relação ao problema, acho mesmo que estamos na direção certa mais ainda falta mais algumas informações para chegarmos a solução.

drsmachado

Qual o SQL gerado pelo hibernate no momento da consulta?
Está utilizando HQL ou NativeQuery ou Criteria?
No meu entender, o problema não está no mapeamento em si, mas na forma como a consulta está sendo realizada.

cristianovieira

Como no momento estou no trabalho não vou conseguir postar a SQL, mas estou utilizando o critéria, postarei os codigos assim que chegar em casa.

drsmachado

Certo, assim que postar eu dou uma olhada.
A princípio, a única função do Eager e do Lazy é carregar imediatamente ou quando necessário os atributos relacionados à uma entidade. Isto não deveria interferir no resultado da consulta, apenas dizer o que precisa ser consultado no bd.

Rodrigo_Sasaki

Eu acho que depende, se a busca dele trouxer o mesma referência para todos os relacionamentos, mantendo somente 1 referência na sessão, tudo bem.

Agora se houver mais de uma instância da mesma classe com o mesmo identificador, pode ser lançada uma NonUniqueObjectException.

O que me faz perguntar também, qual é a exceção lançada no caso (se é que é lançada alguma)?

cristianovieira

Não é gerado nenhum tipo de exception, ele apenas traz a lista com 2 pedidos, sendo que os objetos são iguais, tem a mesma referencia.

Rodrigo_Sasaki

Então o drsmachado identificou o problema mais provável :slight_smile:

drsmachado

digaoneves:
Eu acho que depende, se a busca dele trouxer o mesma referência para todos os relacionamentos, mantendo somente 1 referência na sessão, tudo bem.

Agora se houver mais de uma instância da mesma classe com o mesmo identificador, pode ser lançada uma NonUniqueObjectException.

O que me faz perguntar também, qual é a exceção lançada no caso (se é que é lançada alguma)?


A função específica do lazy é

Ou seja, apenas “protelar” o carregamento de um campo até que ele seja acessado.
Já Eager:

Ou seja, quando um relcionamento indica o fetch eager, todos os atributos são imediatamente carregados, junto à entidade principal.

Sendo assim, ou o mapeamento está errado ou a query está errada. O fetch não deveria interferir.

Rodrigo_Sasaki

Sim, a minha suposição foi por não saber o “como” que ele traria as e entidades dos relacionamentos, se elas teriam uma única referência na Sessão ou não, mas imagino que o Hibernate seja bom o suficiente pra saber tratar essas coisas.

Mas pela resposta que o cristianovieira deu acima, deu pra perceber que provavelmente o problema está na query gerada, como você disse.

cristianovieira

Bom segue abaixo as SQLS tirei a parte do SELECT, são apenas os campos então segue do FROM em diante:

Relacionamento com

@OneToMany(mappedBy=pedido, fetch=FetchType.LAZY)

@Cascade(CascadeType.ALL)

private List itempedido;
from
        public.pedido this_ 
    left outer join
        public.empresa empresa2_ 
            on this_.empe_id=empresa2_.empe_id 
    left outer join
        public.enderecoempresa enderecoem3_ 
            on empresa2_.enderecoempresa_ende_id=enderecoem3_.ende_id 
    left outer join
        public.empresa empresa4_ 
            on enderecoem3_.empe_id=empresa4_.empe_id 
    left outer join
        public.tipoendereco tipoendere5_ 
            on enderecoem3_.tpen_id=tipoendere5_.tpen_id 
    left outer join
        public.empresa empresa6_ 
            on tipoendere5_.empe_id=empresa6_.empe_id 
    left outer join
        public.usuario usuario7_ 
            on tipoendere5_.usua_id=usuario7_.usua_id 
    left outer join
        public.empresa empresa8_ 
            on usuario7_.empe_id=empresa8_.empe_id 
    left outer join
        public.grupousuario grupousuar9_ 
            on usuario7_.grus_id=grupousuar9_.grus_id 
    left outer join
        public.empresa empresa10_ 
            on grupousuar9_.empe_id=empresa10_.empe_id 
    left outer join
        public.usuario usuario11_ 
            on grupousuar9_.usua_id=usuario11_.usua_id 
    left outer join
        public.usuario usuario12_ 
            on enderecoem3_.usua_id=usuario12_.usua_id 
    left outer join
        public.pessoa pessoa13_ 
            on this_.pess_id=pessoa13_.pess_id 
    left outer join
        public.cliente pessoa13_1_ 
            on pessoa13_.pess_id=pessoa13_1_.pess_id 
    left outer join
        public.prestadorservico pessoa13_2_ 
            on pessoa13_.pess_id=pessoa13_2_.pess_id 
    left outer join
        public.motorista pessoa13_3_ 
            on pessoa13_.pess_id=pessoa13_3_.pess_id 
    left outer join
        public.funcionario pessoa13_4_ 
            on pessoa13_.pess_id=pessoa13_4_.pess_id 
    left outer join
        public.vendedor pessoa13_5_ 
            on pessoa13_.pess_id=pessoa13_5_.pess_id 
    left outer join
        public.fornecedor pessoa13_6_ 
            on pessoa13_.pess_id=pessoa13_6_.pess_id 
    left outer join
        public.cidade cidade14_ 
            on pessoa13_.cida_id=cidade14_.cida_id 
    left outer join
        public.empresa empresa15_ 
            on cidade14_.empe_id=empresa15_.empe_id 
    left outer join
        public.usuario usuario16_ 
            on cidade14_.usua_id=usuario16_.usua_id 
    left outer join
        public.empresa empresa17_ 
            on pessoa13_.empe_id=empresa17_.empe_id 
    left outer join
        public.usuario usuario18_ 
            on pessoa13_.usua_id=usuario18_.usua_id 
    left outer join
        public.formapagto formapagto19_ 
            on pessoa13_1_.fpto_id=formapagto19_.fpto_id 
    left outer join
        public.empresa empresa20_ 
            on formapagto19_.empe_id=empresa20_.empe_id 
    left outer join
        public.usuario usuario21_ 
            on formapagto19_.usua_id=usuario21_.usua_id 
    left outer join
        public.refpagto refpagto22_ 
            on pessoa13_1_.repg_id=refpagto22_.repg_id 
    left outer join
        public.empresa empresa23_ 
            on refpagto22_.empe_id=empresa23_.empe_id 
    left outer join
        public.usuario usuario24_ 
            on refpagto22_.usua_id=usuario24_.usua_id 
    left outer join
        public.regiao regiao25_ 
            on pessoa13_1_.regi_id=regiao25_.regi_id 
    left outer join
        public.empresa empresa26_ 
            on regiao25_.empe_id=empresa26_.empe_id 
    left outer join
        public.usuario usuario27_ 
            on regiao25_.usua_id=usuario27_.usua_id 
    left outer join
        public.vendedor vendedor28_ 
            on pessoa13_1_.pess_idv=vendedor28_.pess_id 
    left outer join
        public.pessoa vendedor28_1_ 
            on vendedor28_.pess_id=vendedor28_1_.pess_id 
    left outer join
        public.regiao regiao29_ 
            on vendedor28_.regi_id=regiao29_.regi_id 
    left outer join
        public.comissao comissao30_ 
            on vendedor28_.pess_id=comissao30_.vendedor_pess_id 
    left outer join
        public.usuario usuario31_ 
            on comissao30_.usua_id=usuario31_.usua_id 
    left outer join
        public.refpagto refpagto32_ 
            on pessoa13_2_.repg_id=refpagto32_.repg_id 
    left outer join
        public.atividadeeconomica atividadee33_ 
            on pessoa13_6_.atec_id=atividadee33_.atec_id 
    left outer join
        public.empresa empresa34_ 
            on atividadee33_.empe_id=empresa34_.empe_id 
    left outer join
        public.tipoatividadeeconomica tipoativid35_ 
            on atividadee33_.taen_id=tipoativid35_.taen_id 
    left outer join
        public.empresa empresa36_ 
            on tipoativid35_.empe_id=empresa36_.empe_id 
    left outer join
        public.usuario usuario37_ 
            on tipoativid35_.usua_id=usuario37_.usua_id 
    left outer join
        public.usuario usuario38_ 
            on atividadee33_.usua_id=usuario38_.usua_id 
    left outer join
        public.formapagto formapagto39_ 
            on pessoa13_6_.fpto_id=formapagto39_.fpto_id 
    left outer join
        public.refpagto refpagto40_ 
            on pessoa13_6_.repg_id=refpagto40_.repg_id 
    left outer join
        public.usuario usuario41_ 
            on this_.usua_id=usuario41_.usua_id 
    where
        this_.empe_id=? 
    order by
        this_.pedi_id asc
Relacionamento com

@OneToMany(mappedBy=pedido, fetch=FetchType.EAGER)

@Cascade(CascadeType.ALL)

private List itempedido;
from
        public.pedido this_ 
    left outer join
        public.empresa empresa2_ 
            on this_.empe_id=empresa2_.empe_id 
    left outer join
        public.enderecoempresa enderecoem3_ 
            on empresa2_.enderecoempresa_ende_id=enderecoem3_.ende_id 
    left outer join
        public.empresa empresa4_ 
            on enderecoem3_.empe_id=empresa4_.empe_id 
    left outer join
        public.tipoendereco tipoendere5_ 
            on enderecoem3_.tpen_id=tipoendere5_.tpen_id 
    left outer join
        public.empresa empresa6_ 
            on tipoendere5_.empe_id=empresa6_.empe_id 
    left outer join
        public.usuario usuario7_ 
            on tipoendere5_.usua_id=usuario7_.usua_id 
    left outer join
        public.empresa empresa8_ 
            on usuario7_.empe_id=empresa8_.empe_id 
    left outer join
        public.grupousuario grupousuar9_ 
            on usuario7_.grus_id=grupousuar9_.grus_id 
    left outer join
        public.empresa empresa10_ 
            on grupousuar9_.empe_id=empresa10_.empe_id 
    left outer join
        public.usuario usuario11_ 
            on grupousuar9_.usua_id=usuario11_.usua_id 
    left outer join
        public.usuario usuario12_ 
            on enderecoem3_.usua_id=usuario12_.usua_id 
    left outer join
        public.itempedido itempedido13_ 
            on this_.pedi_id=itempedido13_.pedi_id 
    left outer join
        public.empresa empresa14_ 
            on itempedido13_.empe_id=empresa14_.empe_id 
    left outer join
        public.produto produto15_ 
            on itempedido13_.prod_id=produto15_.prod_id 
    left outer join
        public.empresa empresa16_ 
            on produto15_.empe_id=empresa16_.empe_id 
    left outer join
        public.grupoproduto grupoprodu17_ 
            on produto15_.gppr_id=grupoprodu17_.gppr_id 
    left outer join
        public.empresa empresa18_ 
            on grupoprodu17_.empe_id=empresa18_.empe_id 
    left outer join
        public.usuario usuario19_ 
            on grupoprodu17_.usua_id=usuario19_.usua_id 
    left outer join
        public.unidademedida unidademed20_ 
            on produto15_.unid_id=unidademed20_.unid_id 
    left outer join
        public.empresa empresa21_ 
            on unidademed20_.empe_id=empresa21_.empe_id 
    left outer join
        public.usuario usuario22_ 
            on unidademed20_.usua_id=usuario22_.usua_id 
    left outer join
        public.usuario usuario23_ 
            on produto15_.usua_id=usuario23_.usua_id 
    left outer join
        public.usuario usuario24_ 
            on itempedido13_.usua_id=usuario24_.usua_id 
    left outer join
        public.pessoa pessoa25_ 
            on this_.pess_id=pessoa25_.pess_id 
    left outer join
        public.cliente pessoa25_1_ 
            on pessoa25_.pess_id=pessoa25_1_.pess_id 
    left outer join
        public.prestadorservico pessoa25_2_ 
            on pessoa25_.pess_id=pessoa25_2_.pess_id 
    left outer join
        public.motorista pessoa25_3_ 
            on pessoa25_.pess_id=pessoa25_3_.pess_id 
    left outer join
        public.fornecedor pessoa25_4_ 
            on pessoa25_.pess_id=pessoa25_4_.pess_id 
    left outer join
        public.funcionario pessoa25_5_ 
            on pessoa25_.pess_id=pessoa25_5_.pess_id 
    left outer join
        public.vendedor pessoa25_6_ 
            on pessoa25_.pess_id=pessoa25_6_.pess_id 
    left outer join
        public.cidade cidade26_ 
            on pessoa25_.cida_id=cidade26_.cida_id 
    left outer join
        public.empresa empresa27_ 
            on cidade26_.empe_id=empresa27_.empe_id 
    left outer join
        public.usuario usuario28_ 
            on cidade26_.usua_id=usuario28_.usua_id 
    left outer join
        public.empresa empresa29_ 
            on pessoa25_.empe_id=empresa29_.empe_id 
    left outer join
        public.usuario usuario30_ 
            on pessoa25_.usua_id=usuario30_.usua_id 
    left outer join
        public.formapagto formapagto31_ 
            on pessoa25_1_.fpto_id=formapagto31_.fpto_id 
    left outer join
        public.empresa empresa32_ 
            on formapagto31_.empe_id=empresa32_.empe_id 
    left outer join
        public.usuario usuario33_ 
            on formapagto31_.usua_id=usuario33_.usua_id 
    left outer join
        public.refpagto refpagto34_ 
            on pessoa25_1_.repg_id=refpagto34_.repg_id 
    left outer join
        public.empresa empresa35_ 
            on refpagto34_.empe_id=empresa35_.empe_id 
    left outer join
        public.usuario usuario36_ 
            on refpagto34_.usua_id=usuario36_.usua_id 
    left outer join
        public.regiao regiao37_ 
            on pessoa25_1_.regi_id=regiao37_.regi_id 
    left outer join
        public.empresa empresa38_ 
            on regiao37_.empe_id=empresa38_.empe_id 
    left outer join
        public.usuario usuario39_ 
            on regiao37_.usua_id=usuario39_.usua_id 
    left outer join
        public.vendedor vendedor40_ 
            on pessoa25_1_.pess_idv=vendedor40_.pess_id 
    left outer join
        public.pessoa vendedor40_1_ 
            on vendedor40_.pess_id=vendedor40_1_.pess_id 
    left outer join
        public.regiao regiao41_ 
            on vendedor40_.regi_id=regiao41_.regi_id 
    left outer join
        public.comissao comissao42_ 
            on vendedor40_.pess_id=comissao42_.vendedor_pess_id 
    left outer join
        public.usuario usuario43_ 
            on comissao42_.usua_id=usuario43_.usua_id 
    left outer join
        public.refpagto refpagto44_ 
            on pessoa25_2_.repg_id=refpagto44_.repg_id 
    left outer join
        public.atividadeeconomica atividadee45_ 
            on pessoa25_4_.atec_id=atividadee45_.atec_id 
    left outer join
        public.empresa empresa46_ 
            on atividadee45_.empe_id=empresa46_.empe_id 
    left outer join
        public.tipoatividadeeconomica tipoativid47_ 
            on atividadee45_.taen_id=tipoativid47_.taen_id 
    left outer join
        public.empresa empresa48_ 
            on tipoativid47_.empe_id=empresa48_.empe_id 
    left outer join
        public.usuario usuario49_ 
            on tipoativid47_.usua_id=usuario49_.usua_id 
    left outer join
        public.usuario usuario50_ 
            on atividadee45_.usua_id=usuario50_.usua_id 
    left outer join
        public.formapagto formapagto51_ 
            on pessoa25_4_.fpto_id=formapagto51_.fpto_id 
    left outer join
        public.refpagto refpagto52_ 
            on pessoa25_4_.repg_id=refpagto52_.repg_id 
    left outer join
        public.usuario usuario53_ 
            on this_.usua_id=usuario53_.usua_id 
    where
        this_.empe_id=? 
    order by
        this_.pedi_id asc
cristianovieira

Conclusão - Com o LAZZY eu não vi o

left outer join public.itempedido itempedido13_ on this_.pedi_id=itempedido13_.pedi_id

Ou seja, quando ele executa esse relacionamento ele duplica. Agora por que ?? Qual é a solução para isso ?
Lembro que tive um problema desses e resolvi com @IndexColumn mas ja tentei utilizar e não deu certo.

drsmachado

O LEFT OUTER JOIN tem como função buscar dados entre tabelas relacionadas mesmo que os valores da tabela relacionada seja nulo.
A diferença gerada entre o EAGER e O LAZY é normal, pois o comportamento de uma consulta que abrange tudo num único momento e de uma consulta que primeiro carrega o essencial e o que for necessário posteriormente é carregado on demand, pode ter tal diferença.
Uma solução meio tosca seria o uso do UNIQUE (a API do Criteria contempla um método que define UNIQUE na cláusula WHERE), pois, se os dados forem idênticos, apenas um deles será mostrado (independente de haver mais de 2).
Aliás, observando bem as anotações, eu removeria todos os @FETCH dali, pois, ao meu ver, não são necessárias.

cristianovieira

Repare que todos os relacionamentos ToOne que possui a anotação @Fetch, o relacionamento que está me gerando esse transtorno que é o:

@OneToMany(mappedBy="pedido", fetch=FetchType.LAZY)
@Cascade(CascadeType.ALL)
private List<ItemPedido> itempedido;

não tem a anotação @Fetch só tem o fetch dentro do @OneToMany que neste caso é desnecessário devido ao valor default de relacionamentos ToMany ser LAZY. Com relação a unique na clausula where segue o codigo abaixo responsável pela consulta, o que você acha que devo alterar?

@Override
	public Collection<E> filtragem(final Filter filter, final Class classePesquisa) throws CronosException{

		return getJpaTemplate().executeFind(new JpaCallback<E>() {

			@Override
			public E doInJpa(final EntityManager em) throws PersistenceException {

				Session session;
				if (entityManager.getDelegate() instanceof EntityManagerImpl) {
				    final EntityManagerImpl entityManagerImpl = (EntityManagerImpl) entityManager.getDelegate();
				    session = entityManagerImpl.getSession();
				} else {
				    session = (Session) entityManager.getDelegate();
				}
				final Criteria criteria  = HibernateUtils.buildCriteria(filter, session, classePesquisa);
				return  (E) (Collection<E>)criteria.list();
			}
		});

	}

PS: Este método está em uma classe generica.

drsmachado

final Criteria criteria = HibernateUtils.buildCriteria(filter, session, classePesquisa); criteria.unique();//acho que é isso, não lembro agora return (E) (Collection<E>)criteria.list();

Criado 6 de junho de 2012
Ultima resposta 7 de jun. de 2012
Respostas 17
Participantes 3