Jpa 如果调用多个EJB方法,是否需要事务?
我的问题是,如果调用多个EJB方法,那么需要在JSFbean中定义UserTransaction。 这是我的一般设想:Jpa 如果调用多个EJB方法,是否需要事务?,jpa,jsf-2,transactions,ejb,Jpa,Jsf 2,Transactions,Ejb,我的问题是,如果调用多个EJB方法,那么需要在JSFbean中定义UserTransaction。 这是我的一般设想: //jsf bean... @EJB ejb1; ... public String process(businessobject) { ejb1.op1(businessobject); ejb1.op2(businessobject); .... } 这两种EJB方法都操作相同的复杂jpa实体bean对象(包括刷新和分离)。我在数据库中发现,当在ejb1.op
//jsf bean...
@EJB ejb1;
...
public String process(businessobject) {
ejb1.op1(businessobject);
ejb1.op2(businessobject);
....
}
这两种EJB方法都操作相同的复杂jpa实体bean对象(包括刷新和分离)。我在数据库中发现,当在ejb1.op2()之前调用ejb1.op1()时,一些@oneToMany关系形成了我的实体bean,其中重复了这些关系。
我知道这两个EJB都启动了一个新事务。到目前为止,我觉得一切都很好。
但JSF代码只有在向JSF方法添加UserTransaction时才能正常工作,如下所示:
//jsf bean...
@Resource UserTransaction tx;
@EJB ejb1;
...
public String process(businessobject) {
try {
tx.begin();
ejb1.op1(businessobject);
ejb1.op2(businessobject);
finaly {
tx.commit();
}....
}
我没想到有必要将两个ejb调用封装到一个usertransaction中。为什么必须这样做?您需要用户事务吗?通常,容器管理的事务已经足够好了,可以达到这个目的 即使您需要用户管理的事务,将事务管理逻辑与JSF逻辑混合也不是一个好主意 对于使用容器管理的事务,您应该考虑在EJB上使用@TransactionAttribute
如果ejb中的所有方法都需要相同级别的事务支持,那么可以在类级别上进行注释。否则,您也可以对每个单独的ejb方法使用@TransactionAttribute注释。来自客户端的每个无状态的ejb方法调用(在您的例子中,是JSF托管bean),默认情况下都会算作一个完整的事务。这将持续到EJB方法调用返回为止,包括嵌套的EJB方法调用 如果必须表示单个事务,只需将它们合并到单个EJB方法调用中
public String process(Entity entity) {
ejb1.op1op2(entity);
// ...
}
与
无需在客户端中处理UserTransaction
。在设计良好的基于JSF的客户机应用程序中,您也不应该需要它
至于事务的原因,它会在您对实体执行业务操作时锁定DB。您的错误是,您完全分别执行了两个明显相关的业务操作。在高并发系统中,这可能会在您遇到问题时导致数据库状态损坏
关于交易的原因,这可能是一个很好的解读:谢谢您的解释。这正是我所怀疑的。我将把这些调用放在一个ejb方法/事务中。这种很少发生的奇怪行为现在已经消失了。我一直认为JSF方法也会启动一个新的事务上下文。
public void op1op2(Entity entity) {
op1(entity);
op2(entity);
}