我一直在使用 Java EE 平台进行编程,但有时我会错过更大的图景。
使用 EJB 和Container-Managed Transactions,如何在单个事务中对多个数据源执行操作?
我的代码如下所示:
aaa-ejb 模块
包含一个persistence.xml
指向第一个数据源。
@Stateless
public class AaaDao {
@PersistenceContext
EntityManager em;
// using defaults: @TransactionAttribute(REQUIRED)
public void foo(...) {
em.persist(...);
}
}
bbb-ejb 模块
包含persistence.xml
指向第二个数据源的另一个(不同的持久性单元)。
@Stateless
public class BbbDao {
@PersistenceContext
EntityManager em;
// using defaults: @TransactionAttribute(REQUIRED)
public void bar(...) {
em.persist(...);
}
}
ccc-ejb模块
依赖于以上两个模块。
@Stateless
public class CccBean {
@EJB AaaDao aaaDao;
@EJB BbbDao bbbDao;
// using defaults: @TransactionAttribute(REQUIRED)
public void qux(...) {
aaaDao.foo(...);
bbbDao.bar(...);
}
}
我的意思是:真的那么容易吗?当事情似乎“神奇”地工作时,我总是有点怀疑,我总是怀疑有一个“陷阱”。
在 Oracle WebLogic 10.3 上使用 Java EE 5、EJB 3.0、JPA 1.0。