2012-02-14 84 views
3

我想知道什麼是處理在Hibernate/JPA世界中輸入數據表的正確方法。據我所知,以下三種選擇中的一種導致整個卡片房子崩潰,但我不知道哪一個是錯的。將ice/ace:dataTable與JPA和請求範圍bean集成

  • 半自動交易和EntityManager的通過自定義JSF PhaseListener在開始和提交周圍的每一個請求
  • 把裏面的DataTable
  • 編輯組件使用請求範圍的託管bean是從獲取他們的數據事務處理請求範圍的EntityManager(在PrettyFaces的幫助下,通過URL的請求範圍bean設置ID)
  • 使用請求範圍的bean而不是視圖或會話範圍的bean來備份dataTable。

我看到an ICEfaces dataTable demo using JPA但它們都是手動管理事務並且默認情況下不顯示編輯組件。您單擊導致對象被提名爲可編輯性的行,然後當您點擊「保存」時,手動將對象重新連接到新的EntityManager,然後手動觸發保存。我在這裏看到了點擊編輯功能,它爲我們提供了一種方法來確保將正確的對象重新附加到當前會話中,並且我不知道如果沒有類似的東西,我們將如何生活。我得到的關於新的ICEfaces 3.0 ace:dataTable(néePrimeFaces 2.0 dataTable)的印象是,它打算用在視圖或會話範圍的bean中,但我看不到如何可以繞過StaleObjectState和/或LazyInitializationExceptions,如果有一個模型對象從請求A和EntityManager A中的DAO出來,然後通過請求B與EntityManager B進行修改或分頁。

我想它可能在Java EE通過某種深厚的功夫,但我沒有把我們從Tomcat 6升級到任何更漂亮的東西的奢望(儘管這是我長期的目的)。我們也不會開始使用Spring或Seam或其他很酷的東西。 ICEfaces對我們來說足夠怪異,老實說可能太奇怪了。

那麼總結一下,哪個是錯誤的選擇?請求範圍的實體管理器,請求範圍的數據表或使用dataTable中的編輯組件?或者在這裏有其他問題呢?

回答

4

如果你問我,當你的需求似乎尖叫一些更有趣的東西時,最重要的錯誤似乎是堅持一個幾乎裸露的雄貓。當你不需要「所有那些其他的東西」時,通常你會使用Tomcat,所以當你需要時,爲什麼要繼續使用Tomcat?

這就是說,模式真的不是那麼難。

  • 有一個視圖作用域確定輔助bean
  • 獲取初始數據在@PostConstruct - (當有喜歡的ID沒有參數)或PreRenderViewEvent方法結合視圖參數
  • 使用使用一個單獨的服務的類實體管理器獲取和保存數據
  • 使實體管理器「交易範圍的」
    • 沒有EJB/CDI /春:
      • 從實體管理器工廠爲每個操作獲取新的實體管理器。
      • 啓動一個(資源本地)事務,執行操作,提交事務,關閉實體管理器。
  • 返回直接從您的支持bean實體的名單,綁定表的編輯模式輸入字段的實體的相應屬性。
  • 更新單行時,將相應的實體傳遞給您的服務的更新方法。除了獲得實體經理,開始交易等的開銷之外,這基本上只在實體經理上調用merge()

意識到在您使用detached entities的服務之外的所有時間。因此沒有任何LazyInitializationExceptions的風險。支持bean需要在視圖範圍內,以便JSF更新正確的(detached!)實體,然後您自己的代碼將其傳遞給服務,該服務將其合併到持久性上下文中。

用於持久化的流程是這樣的:

 
View state    View scope  Transaction scoped PC 
Facelet/components  Backing Bean  Service 
     Strings ------> Detached entities --> Attached entities 

(獲取數據流是完全相反的)

創建服務這種方式有點繁瑣,一種受虐狂的運動雖然。對於示例應用程序以及上面討論的兩種方法(獲取和更新),它不會太糟糕,但對於任何大型應用程序而言,這將很快失去控制。

如果您已經將JSF和JPA添加到Tomcat,只需幫助自己並使用類似TomEE的東西。這比Tomcat(25MB vs 7MB)稍大一些,包含了所有你想要避免但實際上仍然需要的東西。

如果您絕對無法升級您的Tomcat安裝(例如產品所有者或經理認爲他擁有服務器而不是開發人員),那麼您可能想要投資學習CDI。這可以很容易地添加到你的戰爭(只是一個額外的jar),讓你把很多繁瑣的代碼抽象出來。你也可以真正使用的一件事是JTA提供者。這也可以單獨添加到您的戰爭中,但您添加的這些東西越多,使用TomEE(或GlassFish,Resin,JBoss等替代品)就會越好。

也看到這篇文章,它涵蓋你的需求各部分:Communication in JSF 2.0

+0

感謝您詳細的解答。如果我有我的druthers,我們將升級到Glassfish;我已經獲得了一些我們的應用程序,可以在它下面成功加載,但沒有任何東西可以在TomEE下實際運行。我完全同意你對情況的分析,我只是沒有強迫組織在這個時候做我想做的事。不過,我想我可以運用你的建議並找到前進的方向。再次感謝! – 2012-02-19 16:29:33

+1

@DanielLyons爲了我們的利益(我在TomEE上工作),你能否提供一些有關TomEE在dev(at)openejb.apache.org上遇到的問題的細節。我們是一個年輕的服務器,我們確實需要所有我們可以獲得的反饋。 – 2012-02-19 22:02:40

+0

本週晚些時候我會告訴你一些細節。我認爲困難是由於它是一個測試版。 – 2012-02-19 23:21:24