我有一个带有bean管理事务的无状态bean,以及这样的方法:
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class ... {
@Resource
private UserTransaction ut;
@EJB
private OtherStatelessBeanLocal other;
public void invokeSomeMethods()
ut.begin();
...
// invoke other bean's methods here.
other.method();
...
ut.commit();
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何UserTransaction
传播到OtherStatelessBeanLocal
bean呢?
对该主题的各种部分描述使我怀疑BMT与应用程序管理的EntityManager(以及UserTransaction的使用)紧密相关,并且CMT与容器管理的EntityManager紧密相关.
任何人都可以(或指向我)清楚地解释BMT/CMT与应用程序/容器管理的EntityManager的确切关系吗?
事务划分类型和EntityManager管理类型之间允许哪些组合?
此外,UserTransaction和BMT/CMT与应用程序/容器管理的EntityManager之间的关系是什么?
编辑:根据http://www.byteslounge.com/tutorials/container-vs-application-managed-entitymanager,我可以将CMT/BMT与应用程序/容器管理的EntityManagers结合起来.这仍然让我有关于UserTransaction和BMT之间关系的问题.一个人是否意味着另一个?
编辑:与上面发布的链接相反,http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html#bnbra声称" 应用程序管理的实体管理器不会自动传播JTA事务上下文.这些应用程序需要手动访问JTA事务管理器并在执行实体操作时添加事务划分信息.javax.transaction.UserTransaction接口定义了开始,提交和回滚事务的方法.通过创建实例来注入UserTransaction实例变量用@Resource注释".对我来说,这听起来像"应用程序管理的实体管理器需要bean管理的事务划分".谁是对的?Oracle还是Byteslounge?
jpa transactions entitymanager java-ee bean-managed-transactions
EJB 3.1规范引用:
13.6.1 Bean管理的事务划分
容器必须使用bean管理的事务划分来管理对企业bean实例的客户端调用,如下所示.当客户端通过企业bean的一个客户端视图调用业务方法时,容器会挂起可能与客户端请求关联的任何事务.
另一方面,来自独立客户端或另一个EJB的事务使用容器管理的事务传播到bean中.从CMT的角度来看,使用CMT的bean似乎还有一个重要的特性(事务传播).
使用BMT对bean施加此限制("交易障碍")的原因是什么?
相关问题:
我对 EJB 和 Bean 管理事务都很陌生。在放弃互联网之后,我发现我可以编写一个 EJ 会话 Bean,它以“bean 管理的方式”执行事务,如下所示:
@TransactionManagement(value=TransactionManagementType.BEAN)
@Stateless
public class OperationBean {
@Resource
private UserTransaction userTransaction;
public void operation() {
try{
userTransaction.begin();
Op1();
Op2();
Op3();
userTransaction.commit();
} catch(Exception e){
userTransaction.rollback();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不明白如果 Op3() 抛出异常会发生什么。Op1() 和 Op2() 如何撤消?
另一个问题是如何将其绑定到 JSF?我需要在 JSF 中编写一个表单,将其数据发送到服务器,OperationBean 根据接收到的数据执行 3 个操作。这些操作确实涉及数据库操作(3个更新),单独来看没有意义。
谢谢!