Org.hibernate.LazyInitializationException

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

[quote]
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[/quote]

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

[code]
for (Pedido pedido : pedidos) {
for (StatusHistorico historico : pedido.getHistorico()){

}

	if (pedido.getDetalhePgtos().size() > 0){
		for (DetalhePagamento detalhePgto : pedido.getDetalhePgtos()) {
			...
		}
	}[/code]

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?

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

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>

[quote=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>[/quote]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.