2011-03-18 19 views
0

我有一個Web應用程序,用戶在其中進行選擇,並在右下方使用ajax,選擇的詳細信息需要顯示。例如,用戶在頂部框架和底部框架中選擇一個人,所有人的詳細信息都會顯示出來。有一大堆人在懶惰地加載。當任何集合被調用時,我都會得到一個預期的懶惰初始化異常。我該如何避免這種情況。如何在ajax調用後重新連接entManager。請求範圍內的重新附加實體entitymanager

回答

-1

我走了本文提出的解決方案。

http://9mmedia.com/blog/?p=272 

感謝您花時間回覆。

+0

鏈接無效 – Andre 2015-03-26 12:51:10

1

這樣做有幾個方法,你在做什麼,在這裏:

  1. 使用預先加載在Person實體所有的收藏品,但是這可能adversly影響性能。
  2. 如果您使用的是JPA 2.0,最簡單的方法是使用OpenEntityManagerInView攔截器。然後,您可以使用JSON Jackson完成json-ify Person實體並將JSON返回到視圖。
  3. 如果選項#1和選項#2不可行,您應該嘗試加載實際的集合對象而不是代理。應該做的是,對於每個集合(可以說集合A)在會話/事務關閉之前調用A.get(0).someGetter()。這將加載集合中對象的實際實例A.這應該爲每個集合完成。在某些情況下,您可以有特定的方法來執行此操作,例如這種情況。
  4. 在關閉會話/事務之前,將完整的Person實體轉換爲其他類型的對象,例如JSON(因爲您在此處使用ajax)。爲此,迭代所有集合中的所有對象,並將其填充到JSON對象中並返回相同的結果。
1

嘗試從已從會話中分離的實體獲取集合時發生LazyInitializationException。

爲此,您必須重新掛接實體,即將其進行管理。首先驗證對象是否與會話相關聯。

contains(Object object) : Check if this instance is associated with this Session. 

基於對象的狀態,可以再次需要&此後的時候可以獲取相關的收藏品讀其狀態。

refresh(Object object) : Re-read the state of the given instance from the underlying database.