2013-05-19 214 views
0

我有一個使用Hibernate的Spring MVC(3.1)web應用程序,它們都能正常工作 - 今天,我試圖將配置完全移至基於註釋的配置(僅使用xml作爲安全性的東西,尚未在代碼配置中由Spring支持)。基於Spring註釋的配置更改

經過一些調整後,我得到的應用程序開始沒有錯誤,主頁加載正確 - 但我看到一些與Hibernate會話不同的行爲 - 即加載實際接觸Hibernate的頁面時出現以下錯誤實體:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tmm.web.domain.Profile.connections, no session or session was closed 

這是發生在以下情形:

  1. 請求達到我的@Controller,它加載用戶Profile對象
  2. 在同樣的方法調用(所以我們不在這裏說分離的實體等)它試圖調用profile.getConnections()
  3. Profile.connections實際上並沒有明確指出fetchtype,所以應該默認爲渴望加載(是我的理解?),但無論哪種方式,getConnections()調用都是在加載profile之後直接調用的 - 即使它是在懶惰地加載,也可能會想到,它可以輕鬆回到數據庫並按需加載連接。

    // @控制器代碼 Account viewedUser = accountService.loadAccountByUserName(userName); (「viewingUserConnections」,viewedUser.getUserProfile()。getConnections());

    // Profile實體 @OneToMany(mappedBy =「user」,cascade = CascadeType.ALL) private List connections = new ArrayList();

現在,我知道關於延遲加載等,所以它不是一個關於這個問題 - 就像我提到的所有Hibernate的東西是正常工作 - 所以我真正的問題是,什麼Spring的配置可能會影響這種行爲?

我可以發佈我之前和之後的XML與註釋配置,但我希望有人可以指向我的一些配置的方向,我可能錯過了切換。

回答

2

你的假設是錯誤的主要是:

在同一個方法調用(所以我們說的不是分離的實體等在這裏)

的方法是控制器的方法。在典型的Spring應用程序中,控制器不是事務性的,但服務是。所以,除非你配置的過濾器或攔截器的「鑑於公開會議」,關閉會話中的事務服務方法返回時,控制器因而總是使用分離的實體

Profile.connections實際上並不顯式聲明fetchtype,所以應該默認爲急切加載

編號XxxToMany關聯默認是懶惰的。

如果在轉換之前使用相同的代碼,我的猜測是在視圖過濾器或攔截器中有一個打開的會話,並且在遷移到註釋時忘記了它。

+0

當然,是的,你是對的 - 我是愚蠢的..第二點,我實際上剛剛測試過,但仍然得到了錯誤的方式。謝謝。 – rhinds

相關問題