我正在創建一個使用JPA進行數據訪問的Java EE應用程序。最初我使用EclipseLink,但通過Moxy獲得的捆綁的Geronimo Javamail實現給了我一些奇怪的問題,我不能強迫它使用Sun Javamail,所以我已經轉換爲Hiberate作爲JPA提供者。 EclipseLink忽略了lazy/eager註解,它急切地加載了所有內容。 Hibernate注重這些註釋,所以依賴對象不會被加載。這意味着,如果我加載一個人說,一個懶惰的父母加載,如果我訪問視圖中的父母它不是懶惰加載,我得到一個異常,說數據庫會話關閉。我知道有兩種方法可以解決這個問題: - 視圖模式/反模式中的開放會話(這從分層的角度來看並不好,可以有N + 1數據庫調用問題,但是容易) - 有服務方法,加載視圖需要的所有數據(這使服務層混亂與大量重複的方法來獲取不同數量的數據)打開純JPA和Spring的會話 - 非休眠會話
爲了參考我的層是視圖 - >控制器 - >服務 - >實體對象 - > JPA。我沒有DTO,因爲它是一個小應用程序,我不喜歡DTO反模式。
思考View模式中的Open Session,問題是OpenSessionInViewInterceptor和OpenSessionInViewFilter都是Hibernate特有的,都需要你在你的Spring配置文件中聲明一個hiberate會話。我更願意繼續使用純粹的JPA,並使用persistence.xml文件進行配置。
我在這裏有什麼選擇?我可以只更改我的Spring配置以明確加載Hibernate,但在應用程序中使用純JPA?有沒有一種純粹的JPA方式實現相同的結果,從視圖延遲加載?
'org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter'? :) – Affe 2012-07-23 20:46:15
感謝感動:) Bozho大約在同一時間有同樣的答案,我可以在他的答案旁邊打勾,但不在你旁邊。 – Tim 2012-07-24 08:43:50