[英]JEE7: Do EJB and CDI beans support container-managed transactions?
Java EE7由一堆“bean”定義組成:
為了擺脫我心中的混亂,我研究了幾篇“何時使用哪種豆類”的文章。 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服務器,因此沒有干擾。
所以我的問題是:
(順便說一句:有人在這里描述了類似的問題,但其解決方案並不適用於我的情況。
在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。
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.