Grails中最常见的地方是哪里有org.hibernate.LazyInitializationException
,原因是什么以及如何解决它?Grails和Hibernate的懒惰初始化异常
我觉得这个例外对于初学者来说有很大的帮助,所以如果你提供更多的例子,那就太好了。
Grails中最常见的地方是哪里有org.hibernate.LazyInitializationException
,原因是什么以及如何解决它?Grails和Hibernate的懒惰初始化异常
我觉得这个例外对于初学者来说有很大的帮助,所以如果你提供更多的例子,那就太好了。
让我们举个例子:
class Book {
String title
Author author
}
class Author {
...
}
Book book = Book.get(1)
正如我们所知,默认获取模式是在域类懒惰。考虑到上面的例子,假设我们获得书对象,那么Book对象会自动附加到hibernate会话对象,即第一级缓存。在域对象从会话对象中分离出来之后,我们试图获取book.author,此时它引发了Lazy初始化异常。
所以解决的办法是,有两种获取方式为渴望或附上你的书的对象使用如下代码Hibernate的Session:
if(!book.isAttached()){
book.attach()
}
上面给出的说明是该方案的一个。可能还有更多。我请求其他人请分享。
我得到了一个,因为我正在检查用户是否有权在与事务无关的服务中使用JSecurity/Shiro执行某些操作。最后,我不得不将服务设置为事务性来排除异常。
这对我来说确实很好,但将它放在需要的地方是很繁琐的! – IgniteCoders 2014-05-23 13:31:05
@IgniteCoders Amit在SO中看起来并不活跃。你知道什么原因和对象在一个会话中被分离吗? – 2017-07-12 15:25:18
@AlexanderSuraphel我真的不知道。当异常升高某处时,我只是将它放置 – IgniteCoders 2017-07-12 19:03:21