簡體   English   中英

JEE7:EJB和CDI bean是否支持容器管理的事務?

[英]JEE7: Do EJB and CDI beans support container-managed transactions?

Java EE7由一堆“bean”定義組成:

  • Managed Beans 1.0(JSR-316 / JSR-250)
  • Java 1.0的依賴注入(JSR-330)
  • CDI 1.1(JSR-346)
  • JSF Managed Beans 2.2(JSR-344)
  • EJB 3.2(JSR-345)

為了擺脫我心中的混亂,我研究了幾篇“何時使用哪種豆類”的文章。 EJB的一個優點似乎是它們單獨支持聲明性容器管理事務 (着名的事務注釋)。 不過,我不確定這是否正確。 任何人都可以批准這個嗎?

同時,我想出了一個簡單的演示應用程序來檢查這是否真的如此。 我剛剛根據這個片段定義了一個CDI bean( 不是 EJB - 它沒有類級別注釋),如下所示:

public class CdiBean {
    @Resource
    TransactionSynchronizationRegistry tsr;

    @Transactional(Transactional.TxType.REQUIRED)
    public boolean isTransactional() {
        return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
    }
}

現在,GlassFish 4.0的結果是這個方法實際上返回true,根據我的詢問,它沒有按預期工作 我確實希望容器忽略CDI bean方法上的@Transactional注釋,或者甚至拋出異常。 我使用新安裝的GlassFish 4服務器,因此沒有干擾。

所以我的問題是:

  • 哪些bean類型實際上支持容器管理的事務?
  • 只是為了好奇,如果上面的代碼錯誤,我怎么能用一個簡單的演示應用程序來測試呢?

(順便說一句:有人在這里描述了類似的問題,但其解決方案並不適用於我的情況。

在Java EE 7之前,只有EJB是事務性的,並且@Transactional注釋不存在。

從Java EE 7和JTA 1.2開始,您可以在CDI中使用事務攔截器和@Transactional注釋。

要回答有關要使用的最佳bean類型的問題,默認情況下答案是CDI。

CDI bean比EJB輕,支持很多功能(包括作為EJB),默認情況下會激活(當你將beans.xml文件添加到你的應用程序時)。 由於Java EE 6 @Inject取代了@EJB 即使您使用遠程EJB(CDI中不存在的功能),最佳做法建議您@EJB一次注入遠程EJB和CDI生成器以將其公開為CDI bean

public class Resources {

    @EJB
    @Produces
    MyRemoteEJB ejb;

}

對於Java EE資源也建議使用相同的方法

public class Resources2 {

    @PersistenceContext
    @Produces
    EntityManager em;

}

這些生產者將在以后使用

public class MyBean {

    @Inject
    MyRemoteEJB bean;

    @Inject
    EntityManager em;

}

EJB繼續對它們包含的某些服務(如JMS或異步處理)有意義,但您將它們用作CDI bean。

Transactionaljavadoc說:

javax.transaction.Transactional注釋為應用程序提供了聲明性地控制CDI托管bean上的事務邊界的能力,以及Java EE規范定義為托管bean的類,在類和方法級別,方法級別注釋覆蓋了班級。

所以,你的假設是錯誤的。 直到Java EE 6,EJB才是支持聲明式事務的唯一組件。 事務性注釋已經在Java EE 7中引入,以使非EJB,托管CDI bean具有事務性。

暫無
暫無

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

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