在JSF2應用程序中討論視圖模式中的開放會話是否有意義? 我的應用程序有調用業務服務EJB的JSF2託管Bean,這些EJB執行所有與數據庫相關的事情(有一個DAO層,但現在沒有關係)。JSF2:在EJB中打開會話?
擁有OSIV模式意味着Managed Bean必須以某種方式確保底層會話已打開。
我也在使用JPA。
在JSF2應用程序中討論視圖模式中的開放會話是否有意義? 我的應用程序有調用業務服務EJB的JSF2託管Bean,這些EJB執行所有與數據庫相關的事情(有一個DAO層,但現在沒有關係)。JSF2:在EJB中打開會話?
擁有OSIV模式意味着Managed Bean必須以某種方式確保底層會話已打開。
我也在使用JPA。
理論上,問題是完全一樣的:實體在離開EJB時會分離,除非某些東西保持EntityManager的作用域打開。 (這裏是一個關於這個話題的偉大的帖子:JPA implementation patterns: Lazy loading)。
從blog post我讀:
8)沒有打開實體管理器在View支持。 [...]在EJB3,當你的實體bean的離開與 交易範圍的的EntityManager, 它是從持久化上下文 分離,你可以不再依賴 懶加載(其實,JPA 規範沒有指定 行爲在這樣的情況下,可能 一些依賴於供應商的異常將 拋出......)當然,你可以使用 的EntityManager與擴展 持久化上下文,抱着 事務和持久化上下文 只要喲你想。但是這個功能是 只適用於SFSB,而DAO 類是 無狀態服務的典型示例,因爲它們只調用 調度到持久層 層。另外,爲每個客戶端 專門設置了 DAO bean實例似乎是一個大的矯枉過正。
但我不確定這是真的。根據我的理解,您應該能夠編寫一個使用UserTransaction
來啓動和提交事務的servlet過濾器(如OSIV中的常規過濾器)。然後,EJB將參與在過濾器中啓動的事務並且EntityManager
將保持打開狀態。我還沒有測試過,但我的建議是試一試。
Caucho有一個過濾器,例如您所描述的過濾器:http://wiki.caucho.com/TransactionFilter – cdmckay 2010-07-12 19:01:32