2012-03-29 48 views
0

我在這裏尋求一些建議。我在Java中使用Hibernate。我已經實現了一個控制器接口,以將用戶界面與數據庫的實際通信隔開。對於給定的接口,我已經實現了一個數據庫控制器類來完成實際的通信。這由靜態控制器工廠提供給用戶界面。休眠的建議(保持會話打開)

現在我發現Hibernate實際上並沒有將我想要的所有內容加載到內存中。對於每個控制器方法調用,我總是打開會話,做我的東西,關閉會話。因此,當我嘗試訪問我的對象結構提示我有錯誤

could not initialize proxy - no Session 

花什麼力氣和谷歌上搜索我的結論是,到我的活動對象引用的對象不是在內存中。

現在我可以選擇從開始使用我的對象到結束的那一刻開始保持會話打開狀態。但它似乎有點多餘和能源效率低下。我想我不會因爲保持會話的開放而損失太多,但我有意將純粹的用戶界面保留在數據庫業務之外。讓我的控制器接口爲用戶界面提供「tearDown」(和「setUp」)方法似乎有點違背給定的邏輯。

+1

我們可能需要您的問題的更多細節,但我建議你檢查http://stackoverflow.com/questions/8493087/hibernate-to-be-lazy-or-not-to-be-lazy – kommradHomer 2012-03-29 14:50:11

+0

我實際上得到原因,我得到我可以避免它。我想我應該更多的是軟件工程。我想我正在查找處理ORM時的標準是什麼,因爲這是我第一次使用它。 – Vampnik 2012-03-29 15:45:24

回答

0

我不明白。您可以從數據庫加載實體對象並在關閉會話後使用它們。對象狀態將被分離。有時可能需要重新將它們重新連接到會話,以便將它們的狀態與db同步。

1

當您使用延遲加載 - 這通常是Hibernate中的默認情況 - 您在關閉會話後無法訪問卸載的實例。

例如,您有一個父表和一個以1:n關係映射的子表(在映射文件中或作爲註釋)。然後,你這樣做:。

1)公開會議
2)負載)這樣的家長
3)關閉會話
4)調用parent.getChild()(或某物
然後在步驟4)你會得到一個錯誤信息,因爲Hibernate之前沒有加載這個項目,它現在想做(懶加載),但它不能,因爲這個會話已經很近了。

如果要關閉會話,請確保已加載所有必需的數據。例如,如果你已經在步驟3)之前完成了步驟4),那麼它會起作用,關閉會話後,你甚至可以再次訪問那個孩子,因爲它已經被加載了。但是由於會話關閉,您將無法將其存儲在數據庫中。