hibernate problema inicialização lenta: LazyInitializationException: failed to preguiçosamente inicializar uma coleção de papel

StackOverflow https://stackoverflow.com/questions/781751

Pergunta

Eu quero gerenciar uma transação na minha camada de persistência, Mas quando eu tento buscar os resultados preguiçosamente eu recebo este erro:

org.hibernate.LazyInitializationException: failed to preguiçosamente inicializar uma coleção de papel

Posso usar LockMode ou qualquer outra maneira de resolver este problema? Pode um encontrar um objeto por sua id sem qualquer transação?

Foi útil?

Solução

Seu problema é que a sessão Hibernate já está fechado quando você tenta acessar o conteúdo. Hibernate não pode carregar o conteúdo sem uma sessão. Normalmente existem duas maneiras de mitigar este problema:

  1. Não feche a sessão até que você é feito com a página. Este padrão é chamado de "sessão na vista" e pode por exemplo ser implementado com um filtro de servlet.

  2. Inicializar todos os conteúdos que você precisa antes de fechar a sessão. Se você quiser inicializar todo o objeto que você pode usar Hibernate.initialize (objeto).

edit:. Você não pode fazer qualquer coisa fora de uma transação em Hibernate

Outras dicas

Você também pode olhar para a solução oficial da hibernação em http://www.hibernate.org/43.html

Normalmente, o problema é que um dos atributos do objecto é preguiçosamente carregado. Uma coisa que você pode fazer é tê-lo pré-carregado em sua consulta:

de Venda venda onde sale.date>: startDate esquerda join fetch sale.product

Este irá pré-busca o objeto sale.product.

este site tem mais informações: http://www.javalobby.org/ artigos / hibernate-query-101 / .

-Dave

Existem muitas maneiras de pré-busca propriedades, então eles estão lá após a sessão é fechada:

  1. Apenas chamar getter apropriado. Depois de campo é obtido em feijão é lá após a sessão é fechada.
  2. Use atributo apropriado no descritor de feijão em JPA você usaria @OneToMany(fetch = FetchType.EAGER), mas existem maneiras de hibernação semelhantes a fazê-lo.
  3. Você pode inicializar campo na consulta HQL (eu não tenho certeza se ele funciona em HQL, mas eu acho que ele faz), olhar para a palavra-chave FETCH INTO.

Ou apenas usar outro ORM ... como Ebean ORM onde o carregamento lento simplesmente funciona:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top