Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 如果调用多个EJB方法,是否需要事务?_Jpa_Jsf 2_Transactions_Ejb - Fatal编程技术网

Jpa 如果调用多个EJB方法,是否需要事务?

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

我的问题是,如果调用多个EJB方法,那么需要在JSFbean中定义UserTransaction。 这是我的一般设想:

//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);
}