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