2011-09-18 72 views
3

我在我的項目中使用Java和Hibernate。我面臨一個非常奇怪的問題。每當我加載一個實體時,選擇不在數據庫上觸發,而是每當我對對象執行一些操作時,比如獲取某個值,那時它就會觸發選擇,這稱爲延遲加載。但問題是我沒有在我的HBM文件中聲明lazy="true"。有時候,加載是成功的,然後當我嘗試對對象進行一些操作時,它會給出錯誤,ProxyInitializationError Session is Closed休眠對象加載失敗

可以檢查下面的鏈接代碼庫: - http://pastebin.com/yD9ZM3yH

但是,如果在實際的方法,我把System.out.println(information.getStudentName());然後代碼工作正常的會話關閉之前選擇被激發。

Regards

回答

3

這是正常的行爲。

當您使用session.load(Object.class, id)返回的對象是代理類。 只要看看這裏我的答案:

What does Hibernate's load() method do for non-existing IDs?

2)您收到此錯誤,因爲當你收到你的代理儘快,Hibernate Session被關閉,代理開始拋出該異常。

你可以在這篇技術文章中閱讀更多關於它和可能的解決方案。

http://community.jboss.org/wiki/OpenSessionInView

希望它能幫助。

+0

+1:另外,請注意,Hibernate 3默認啓用了懶惰。您不必指定它。 –

1

有session.load和session.get之間的差異

有關詳細信息,請參閱本https://forum.hibernate.org/viewtopic.php?p=2387456

要注意的另一件事是你的交易界限。這就是爲什麼加入

System.out.println(information.getStudentName()); 

工作。它發生在會議結束之前,因此代理人能夠初始化該字段。

LAZY與EAGER的負載效應何時以及如何加載相關實體(Collections或OneToOne),而不是如何加載實體的簡單屬性。