2009-08-25 61 views
1

我對Spring很新,我想了解更多有關會話的內容。我已經使用Hibernate註釋過的實體映射了遺留數據庫,並構建了一些服務對象來提取,檢索等。我的實體還包含其他實體(通過外鍵映射)和實體集。當我在我的服務中遍歷entitiy圖時,我沒有問題。我的服務被包裝在一個TransactionProxyFactoryBean中,所以一切都應該很好。Spring中的數據庫會話

因此,在我的視圖控制器中,我從服務請求了一堆實體。但是當我遍歷我的視圖控制器中的實體圖形(例如顯示用戶狀態的國家名稱,州和國家都是懶惰加載的實體)時,Hibernate會話已經關閉,我得到一個「LazyInitializationException:無法初始化代理 - 沒有會話「

我不希望我的服務急於獲取數據,這將消耗多少內存,因爲我的圖形很深,甚至可以有循環引用。我也不想明確地觸及我將在服務中顯示的部分,因爲這意味着我必須一遍又一遍地複製/粘貼類似的服務。所以我想要的是當我在視圖控制器中時,Hibernate會話仍然打開,並且在視圖被提供之前不關閉會話。我可以做些什麼來保持它的開放?

我的視圖bean看起來像這樣,有沒有什麼辦法可以將我的TransactionProxyFactoryBean派生的bean注入它?

<bean name="/" class="example.SimpleViewController"> 
    <property name="userService" ref="userService"/> 
    <property name="catalogService" ref="catalogService"/> 
    </bean> 

乾杯

回答

1

見我回答這個問題:In Spring with jpa/hibernate, how do I keep a session open to avoid lazy initialization exceptions?

我使用Hibernate使用Spring,所以我不是100%肯定的能力春有處理會話,但我相信它有一個內置的過濾器和攔截器。處理JPA之外的會話的最佳方式是編寫一個過濾器,在將它切換到服務器端其餘部分之前打開會話,然後關閉會話。我相信這是Spring內置的東西。

+0

非常常見的問題。在過濾器中打開會話是要走的路。 – 2009-08-25 20:01:33

0

不管你是否使用Spring,你仍然必須使用open-session-in-view模式來避免這個特殊問題。儘管Spring有一些工具可以幫助在Struts或普通JSP等框架上實現設計模式。