2013-04-05 78 views
2

只是我怎麼容器管理事務的諒解澄清JPA(CMTS)工作 -容器管理事務

CMT的備用應用開始和提交事務權明確的努力嗎?

CMTS能夠只適用於會議和mesage驅動Bean和POJO的不?

我對上述問題的理由是 - 我想知道如何從一個Java SE應用程序訪問的實體,以及一個Java EE。我需要兩個單獨的持久性單元嗎?

回答

4

我允許自己完全重寫我的答案因爲它是不是在所有更糟清楚,有些東西是根本過錯。

事實是,你(和我)的混合EJB和JPA術語。
JPA只是在談論實體bean。會話bean(包括CMT和BMT)是EJB規範的一部分。
在JPA,我們將討論容器管理和應用程序管理的實體管理器連接到JTA或本地資源persitence單元。

這裏是JPA規範的相關部分:

容器管理的實體管理器必須是JTA實體管理。 JTA實體管理器僅指定 用於Java EE容器。 應用程序管理的實體管理器可以是JTA實體管理器或資源本地實體管理器。

[...]

兩個JTA實體管理器和所需資源本地實體管理器中的Java EE Web容器和EJB容器中受到支持。在EJB環境中,通常使用JTA實體管理器。 通常,在Java SE環境中只支持資源本地實體管理器。

[...]

實體管理其交易通過JTA控制是JTA實體管理器。一個JTA 實體管理器參與當前的JTA事務,這是開始,致力於外部 實體管理器,並傳播到底層資源manager.`

[...]

當使用容器管理的實體管理器,持久化上下文的生命週期始終爲 ,對應用程序透明,並且持久化上下文與 一起傳播JTA事務

所以,你需要定義2持久化單元只有當你想使用JTA(天氣或不是容器管理)實體管理器中的Java EE應用程序。

+0

如何會話bean不是持久性單元的一部分?你究竟是什麼意思?只有實體bean是持久性單元的一部分,不是嗎? – bennidi 2013-04-05 10:49:02

+0

另外:交易類型RESOURCE_LOCAL/JTA是不同於CMT/BMT – bennidi 2013-04-05 10:57:37

+1

權利我混淆了兩個,因爲我從來沒有單獨使用ejb,對我來說JTA數據源和CMT走到了一起,但它似乎不是這種情況。 http://stackoverflow.com/questions/3217586/difference-between-a-jta-datasource-and-a-resource-local-datasource – Gab 2013-04-05 12:08:09

1

CMT是聲明式定義的,使用由Java EE容器評估的註釋,然後透明地提供所需的事務處理。 Pojos不受容器管理,因此不能應用CMT。

至於你關於實體的問題。您應該創建一個DAO層來抽象出持久性邏輯的技術細節。你基本上可以使用一個通用的dao實現來支持JPA。這基本上是兩個環境中唯一需要改變的部分。在容器中,您將按照註釋中的定義免費獲得交易。如果以標準java se運行,則必須自己開始/提交/回滾事務。

我建議你創建一個通用的dao實現,它以聲明的方式定義事務並期望在容器中運行。爲了在java se中使用,你有一個用於此dao的裝飾器,它負責處理正確的事務處理以模擬容器實際執行的操作。

我覺得你並不真的需要改變在persistence.xml什麼,但也許我錯了,這裏