2012-08-15 63 views
5

我正在研究體系結構Hibernate/JPA/Spring/Zk,並且我現在增加了許多問題,因爲我必須學習很多框架。OpenSessionInView vs PersistentContext(擴展)

我有一個問題讓我困惑了好幾天。

我聽說有關「模式」的OpenSessionInView來保持Hibernate事務處於活動狀態以進行延遲加載。 許多人也說這種模式不是很乾淨。

另一方面,據說PersistentContext擴展不是線程安全的,因此不適合保持活動entityManager。

那麼,這些問題的真正解決方案是什麼? 我認爲這些問題來自於引入ajax,它允許更多的可能性,特別是在需要時使用延遲加載來加載一些重集合。

現在,我在擴展模式下嘗試了@PersistenceContext。它正在工作...... 我必須爲我的JUnit測試設置它,並且它在我的Web應用程序中也可以工作,不需要更多配置就可以進行延遲加載。

是否框架(Spring,JPA 2.0)的演變意味着它現在更容易,更「乾淨」與PersistentContext一起工作?

如果情況並非如此,我們是否應該使用Spring的OpenSessionInViewFilter並以事務模式替換PersistentContext?

謝謝。

回答

1

我聽到你的聲音。自2008年以來,我在幾個應用程序中實現了這兩種模式。現在,我放棄了任何有狀態的模式。當您向客戶端引入狀態時,您會提出可伸縮性和狀態管理問題:您是否在客戶端中合併,是否保存在用戶會話中,當您通過嚮導並且對象在保存之前必須是瞬態時會發生什麼?你將如何同步客戶端和服務器端的狀態?數據庫更改時會發生什麼 - 客戶端是否中斷?看看現有技術的趨勢,包括Spring MVC:模式是建立兩個項目:1)寧靜的Web服務2)用戶界面。狀態通過不可變的域模型共享。當然,你最終可能會維護一套dtos,但它們是可預測的,便宜的,並且可以無限擴展。

我的推薦?如果要重新使用服務器端驗證,請避免通過線路發送代理對象並處理客戶端上的dtos或與客戶端共享域模型。惰性集合可以通過Ajax的細粒度api調用加載。這樣,你就可以完全控制客戶。

這就是社交網絡在過去五年中的規模。