2014-07-24 31 views
3

儘管我需要這個答案才能更好地理解如何在Wildfly 8.1中集成Vaadin 7和JPAContainer插件,但這是一個適用於Hibernate的普遍問題, Eclipse鏈接JPA實現。EclipseLink和Hibernate之間長時間運行會話(Vaadin 7和JPAContainer)的區別

JPACaontainer Vaadin Addon建議爲整個servlet會話建立一個EntityManager,這個IMO並不是很好的設計,因爲AFAIK(並且請糾正我)縮放它總是會更好地使用無狀態的EntityManager-Per-Request模式

JPAContaner附加組件指出:

  1. Hibernate無法保持實體管理長期沒有問題。
  2. Hibernate的一個問題是它是爲短期會話而設計的,但實體管理器的生命週期通常大致是用戶會話(讀取,servlet會話)的生命週期。問題是,如果在會話或實體管理器中發生錯誤,管理器將變得不可用。這會對使用EclipseLink的長期會話產生很大的問題。

Hibernate和EclipseLink在執行級別上的區別是什麼?或者,這兩個陳述首先是有效的嗎?

+0

EntityManager API用於訪問特定工作單元中的數據庫。 (來源:http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/#d0e61)Em被設計爲短命。在相關的JSR – Gab

回答

2

我只能對Hibernate說話,所以這裏是我的想法:

  • Hibernate支持long-conversations,你可以選擇

    • 「分離對象」
    • 「擴展會話工作「(休眠會話與DB斷開連接,但未關閉)

    樂觀鎖定機制可以防止丟失更新,所以對話越短,過時的例外機率就越小。

    如果發生任何約束衝突,會話確實無法使用,這使得「擴展會話」比使用「分離實體」更脆弱。

    對於分離的對象,您保留對您計劃在整個對話中管理的實體的引用,並且只有在工作流程爲 時重新附加它們(或合併它們)。

  • 根據Hibernate Session docs

    如果Session拋出異常,事務必須回滾 背部和會話丟棄。會話 的內部狀態可能與異常發生後的數據庫不一致。

    如果內部會話狀態不能同步到數據庫的任何更多的會話不再可用,你將不得不重新開始一個新的乾淨的會議(因爲約束衝突異常或樂觀鎖異常)。否則,只要當前實體過時或數據無效,您就會繼續接收保存異常。

    一種替代方法是清除會話並放棄所有當前掛起的更改,最終拋出異常,或刷新失敗的實體。

我想知道的EclipseLink如何管理在這些情況下工作,作爲一個破碎的會話並不總是可恢復的,當你有陳舊的數據,令人耳目一新將意味着「失去的更新」等。

+0

中很清楚我對hibernate作爲JPA實現的行爲更感興趣。所以,當你說「Session」時,我可以閱讀「EntityManager」還是有點不同?另外,如何在標準JEE中選擇使用「分離對象」或「擴展會話」? –

+1

Hibernate Session與JPA的EntityManager相同。在標準JEE中,擴展持久化上下文通常使用[有狀態會話Bean](https://blogs.oracle.com/enterprisetechtips/entry/extended_persistence_context_in_stateful)實現。 Adam Bien的「反思最佳實踐」就是這種模式的一個很好的例子。對於「分離的對象」,您只需將實體從服務層傳遞到視圖層,並且它們變成「分離的」,不再由持久性上下文管理。下一個請求可能會重新發送「分離的實體」返回服務。 –

+0

難以置信的有用答案。我學到了比我預期更多的hibernate。現在只是關於EclipseLink的區別。我會等一會兒,或許有人指出eclipse鏈接是如何工作的。謝謝。 –

相關問題