簡體   English   中英

容器管理的交易

[英]Container-Managed Transactions

請澄清一下我對JPA中容器管理的交易(CMT)的工作方式的理解-

CMT可以使應用程序省去啟動和提交事務的工作,對嗎?

CMT只能應用於會話和消息驅動的bean,不能應用於pojos?

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

我允許自己完全重寫我的答案,因為它根本不清楚,更糟的是,有些事情簡直是錯誤的。

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

這是JPA規范的相關部分:

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

[...]

Java EE Web容器和EJB容器均需要同時支持JTA實體管理器和資源本地實體管理器。 在EJB環境中,通常使用JTA實體管理器。 通常,在Java SE環境中,僅支持資源本地實體管理器。

[...]

通過JTA控制事務的實體管理器是JTA實體管理器。 JTA實體管理器參與當前的JTA事務,該事務在實體管理器外部開始並提交,並傳播到基礎資源管理器。

[...]

使用容器管理的實體管理器時,始終自動對應用程序透明地管理持久性上下文的生命周期,並且持久性上下文隨JTA事務傳播

因此,僅當您想在Java EE應用程序中使用JTA(天氣或非容器管理的)實體管理器時,才需要定義2個持久性單元。

CMT是使用Java EE容器評估的注釋以聲明方式定義的,然后將透明地提供所需的事務處理。 Pojos不受容器管理,因此無法應用CMT。

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

我建議您創建一個通用的dao實現,該實現以聲明方式定義事務並希望在容器內運行。 為了在Java SE中使用,您需要為此dao裝飾器,該裝飾器負責適當的事務處理以模仿容器實際執行的操作。

我認為您實際上不需要更改persistence.xml中的任何內容,但也許我在這里錯了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM