Problemas com FetchType.LAZY

3 respostas
O

Olá Pessoal, estou usando: JBoss 4.2.1 + EJB3 + Hibernate com o JPA + JSF + Facelets + Richfaces e estou com o seguinte problema:

Nos meus relacionamentos @OneToMany estou usando o FetchType.LAZY, exemplo:

Tabela Empresas

@Entity
@Table(name = "empresas")
public class Empresas implements Serializable {
.........
@OneToMany(cascade = CascadeType.ALL, mappedBy = "codEmpresa", fetch = FetchType.LAZY)
private Collection<Combustiveis> combustiveisCollection;
.........

}

Tabela Combustíveis

@Entity
@Table(name = "combustiveis")
public class Combustiveis implements Serializable {

......

    @JoinColumn(name = "codEmpresa", referencedColumnName = "codEmpresa", nullable = false)
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Empresas codEmpresa;

.......

}

Quando preciso acessar no meu Bean:

consultaCombustiveis = empresas.getCombustiveisCollection();

Recebo o seguinte erro do servidor:

2010-06-24 12:02:40,685 ERROR [org.hibernate.LazyInitializationException] failed to lazily initialize a collection of role: br.com.courartinformatica.transcontrol.modelo.dominio.Empresas.combustiveisCollection, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: br.com.courartinformatica.transcontrol.modelo.dominio.Empresas.combustiveisCollection, no session or session was closed

Alguém sabe como posso resolver isso?

Obrigado.

3 Respostas

thiagocg

Olá, vc pode resolver isso de 4 maneiras.

1º. Trocando a linha:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "codEmpresa", fetch = FetchType.LAZY)

por

@OneToMany(cascade = CascadeType.ALL, mappedBy = "codEmpresa", fetch = FetchType.EAGER)

2º Tirando esse mapeamento de combustiveis da classe Empresas, ai vc vai precisar criar uma consulta que te devolva os combustiveis a empresa selecionada.

3º Não me lembro ao certo, mas no hibernate tem um lance onde vc pode inicializar uma coleção, da uma pesquisada sobre um metodo tipo: hibernate.initialize(seuObjeto.getSuaColeção), creio q é isso.

4º Se vc usar o metodo get enquanto vc estiver com a sessão aberta, pois assim o hibernate consegue buscar essa coleção, caso contrario com a sessão fechada vc vai ter apenas um proxy apontando pra essa coleção.

Espero ter ajudado!

[]'s

O

Olá Thiagocg, obrigado pelas dicas.

Resolvi de uma 5ª maneira.
Criei um Dao com EntityManager, nesse Dao fiz todas as minhas pesquisas através de consultas.
Problema resolvido…

[]s

Osvano

thokk

Para ficar mais legivel, na JPQL coloque o JOIN FETCH que vc vai conseguir seu objeto Lazy.

Criado 24 de junho de 2010
Ultima resposta 7 de jul. de 2010
Respostas 3
Participantes 3