Org.hibernate.LazyInitializationException

3 respostas
Mavericks

Na segunda iteração pelo loop, ao chamar getDetalhePgtos, é lançada a exception

ERROR [org.hibernate.LazyInitializationException] failed to lazily initialize a collection of role: com.xxx.vo.Pedido.detalhePgtos, no session or session was closed: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.xxx.vo.Pedido.detalhePgtos, no session or session was closed
Mapeamentos na classe Pedido
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pedido")
	private List<StatusHistorico> historicos;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pedido")
	private List<ItemPedido> itens;
	
	@OneToMany(fetch = FetchType.LAZY, mappedBy = "pedido")
	private List<DetalhePagamento> detalhePgtos;
Na classe DetalhePagamento
@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumns({@JoinColumn(name="CODIGO",insertable=false, updatable=false),@JoinColumn(name="PARCEIRO",insertable=false, updatable=false)})
	private Pedido pedido;
Loop onde é lançada a exception
for (Pedido pedido : pedidos) {
		for (StatusHistorico historico : pedido.getHistorico()){
			...
		}
			
		if (pedido.getDetalhePgtos().size() > 0){
			for (DetalhePagamento detalhePgto : pedido.getDetalhePgtos()) {
				...
			}
		}
Método que carrega os pedidos
@Transactional
	public List<Pedido> obtemPedidos(HashMap<String, Object> parametros, Boolean carregaDetalhes ) {
		
		Query query = doQuery(parametros);
		List<Pedido> pedidos = (List<Pedido>) query.getResultList();
		
		if (carregaDetalhes){
			for (Pedido pedido : pedidos) {
				pedido .getHistorico();
				pedido .getItem();
				pedido .getDetalhePgtos();
			}
		}
		return pedidos;
	}

Debugando o método obtemPedidos e carregando os detalhes, Historico, Itens e Detalhes são carregados corretos, ao ir para classe Controler, o erro acontece.
Alguém pode ajudar?

3 Respostas

Hebert_Coelho

Esse post te ajudará: Quatro soluções para LazyInitializationException.

Mavericks

Hebert,

Conforme seu post, estou carregando a coleção por anotação.
Mas, carrego 3 coleções e apenas uma pode ser EAGER, conforme o primeiro bloco de código que postei.

A opção Filter, já está sendo utilizada.

<filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Hebert_Coelho

Mavericks:
Hebert,

Conforme seu post, estou carregando a coleção por anotação.
Mas, carrego 3 coleções e apenas uma pode ser EAGER, conforme o primeiro bloco de código que postei.

A opção Filter, já está sendo utilizada.

<filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Então desculpe, mas seu Filter não está funcionando. O.o
Não sei se é alguma configuração errada ou qualquer outra coisa mas… Se essa é a configuração do OSIV, é muito estranho que não esteja funcionando.

Criado 17 de janeiro de 2013
Ultima resposta 17 de jan. de 2013
Respostas 3
Participantes 2