2012-02-08 72 views
0

我在EJB2.0圖層上使用transactions並從那裏打電話給DAO層,其中正在對db進行hibernate調用。關於休眠懶惰初始化錯誤

問題時遇到了現在的問題是,因爲我設置lazy="false"即休眠正在對數據庫多次調用,現在我試圖改變lazy="true"但現在我把我們自己:

org.hibernate.LazyInitializationException:不能初始化代理 - 擁有會話已關閉

錯誤消息。

我做了一些研究SO,發現解決辦法是

<prop key="hibernate.default_batch_fetch_size">30</prop> 
<prop key="hibernate.jdbc.fetch_size"></prop> 

,我的問題是,什麼是fetch_size的默認大小,如果這是解決這個問題的正確方法。

我想要做的就是確保應用程序不會多次調用數據庫來運行所有這些N查詢,因爲現在在頁面之間導航非常痛苦,並且使得應用程序非常緩慢,因爲每次點擊頁面時,都有在後臺運行的查詢的N,並增加了應用程序加載時間。

更新

這裏是怎麼了設置交易:

* @hibernate.class table="SCHEDULE_ENTRY" discriminator-value="task" lazy="true" 
* @hibernate.discriminator column="KIND" length="4" 

會高度讚賞任何建議,以提高休眠的性能。

回答

0
org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed 

當您嘗試訪問對象(代理)的成員,你得到不同的是還沒有被初始化,該對象未綁定到一個會話(分離)。在考慮更改批量大小之前,您必須先解決該問題。

要擺脫該問題,請確保您要訪問的所有屬性都已初始化。 這取決於您可以使用延遲加載的事務/會話配置。如果您發佈您的交易/會話配置,這將會很有幫助。

您可以使用Hibernate.initialize()初始化成員,但我建議只在需要時更改您的抓取策略。

看看here

我希望我能幫到:)

+0

更新了有關如何調用交易的詳細信息。 – Rachel 2012-02-08 18:40:15

1

在關閉會話之前訪問對象的成員。這是主要問題。

+0

這裏的問題是,我正在使用ejb事務並從ejb調用dao,因此會話的維護由ejb事務處理,並且存在多個正在運行的嵌套查詢,因此不確定引發惰性異常的確切位置。 – Rachel 2012-02-08 19:06:01