hibernate problema inicialização lenta: LazyInitializationException: failed to preguiçosamente inicializar uma coleção de papel
-
13-09-2019 - |
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?
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:
-
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.
-
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:
- Apenas chamar getter apropriado. Depois de campo é obtido em feijão é lá após a sessão é fechada.
- 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. - 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:)