2012-07-23 136 views
0

我正在創建一個使用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方式實現相同的結果,從視圖延遲加載?

+1

'org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter'? :) – Affe 2012-07-23 20:46:15

+0

感謝感動:) Bozho大約在同一時間有同樣的答案,我可以在他的答案旁邊打勾,但不在你旁邊。 – Tim 2012-07-24 08:43:50

回答

2
  • 聽起來很奇怪,EclipseLink忽略了標準的JPA註釋。
  • 了JavaMail實現不應在有關JPA任何方式
  • OpenEntityManagerInViewX(過濾器/攔截)的處理相同的情況下爲JPA
  • ,你可以輕鬆地去沒有這個模式,如果你聲明和使用您的收藏明智的。
+0

根據我讀過的內容,Eclipselink需要在編譯時或運行時對類進行後處理,以支持延遲加載,否則您需要使用這些過濾器之一。像Spring中的大多數事情一樣,對於noob來說,配置和工作就會變得很棘手。 JPA與Javamail無關,這正是我改變的原因。 OpenEntityManagerInView正是我之後所做的,謝謝:)雖然我可能不會使用它,但我可能只是在服務層獲取所需的全部數據。 – Tim 2012-07-24 08:41:36