Grails et Lazy l'exception Initialisation de mise en veille prolongée
-
21-09-2019 - |
Question
Où sont ce qui a été la cause et comment avez-vous le résoudre? Les endroits les plus communs où vous avez obtenu un org.hibernate.LazyInitializationException
dans Grails,
Je pense que cette exception arrive beaucoup pour les débutants, donc si vous souhaitez fournir d'autres exemples, ce serait formidable.
La solution
Prenons un exemple:
class Book {
String title
Author author
}
class Author {
...
}
Book book = Book.get(1)
Comme nous le savons, par défaut mode de récupération est paresseux dans les classes de domaine. Compte tenu de l'exemple ci-dessus, disons que nous obtenons l'objet livre, puis l'objet livre se joint à l'objet de la session de mise en veille prolongée i.e. cache de premier niveau automatiquement. Et après que l'objet de domaine se détache de l'objet de la session, puis nous essayons de chercher book.author, en ce moment, il soulève l'exception d'initialisation Lazy.
La solution est donc, d'avoir soit mode de récupération comme désireux ou attacher votre objet livre à hiberner session en utilisant le code ci-dessous:
if(!book.isAttached()){
book.attach()
}
La description donnée ci-dessus est l'un des scénario. Il pourrait y avoir beaucoup d'autres. Je demande d'autres de bien vouloir part.
Autres conseils
Je suis un parce que je vérifiais si un utilisateur avait la permission de faire une action avec JSecurity / Shiro dans un service qui n'a pas été transactionnel. En fin de compte, je devais juste mettre le service en transactionnel pour se débarrasser de l'exception.
Plus d'infos ici: http : //www.nabble.com/JSecurity-LazyInitializationException-in-default-DbRealm.isPermitted%28%29-td24939803.html