Exceção de inicialização preguiçosa de Grails e Hibernate
-
21-09-2019 - |
Pergunta
Onde estão os lugares mais comuns onde você conseguiu um org.hibernate.LazyInitializationException
Em Grails, qual foi a causa e como você a resolveu?
Eu acho que essa exceção surge muito para iniciantes; portanto, se você fornecesse mais exemplos, seria ótimo.
Solução
Vamos dar um exemplo:
class Book {
String title
Author author
}
class Author {
...
}
Book book = Book.get(1)
Como sabemos, o modo de busca padrão é preguiçoso nas classes de domínio. Considerando o exemplo acima, digamos que obtemos o objeto do livro, o objeto de livro é anexado ao objeto de sessão de hibernato, ou seja, cache de primeiro nível automaticamente. E depois que o objeto de domínio é destacado do objeto da sessão e, em seguida, tentamos buscar o livro.
Portanto, a solução é, para ter o modo buscar como ansioso ou anexar seu objeto de livro à sessão de hibernar usando o código fornecido abaixo:
if(!book.isAttached()){
book.attach()
}
A descrição dada acima é um dos cenários. Pode haver muito mais. Peço outros que compartilhem.
Outras dicas
Consegui um porque estava verificando se um usuário tivesse permissão para fazer alguma ação com a JSecurity/Shiro em um serviço que não era transacional. No final, tive que definir o serviço como transacional para me livrar da exceção.
Mais informações aqui: http://www.nabble.com/jsecurity-lazyinitializationexception-in-default-dbrealm.ispermitt%28%29-td24939803.html