Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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
Java 使用多个EJB在一个事务中保存来自CDI托管bean的数据_Java_Jsf_Jakarta Ee_Primefaces_Cdi - Fatal编程技术网

Java 使用多个EJB在一个事务中保存来自CDI托管bean的数据

Java 使用多个EJB在一个事务中保存来自CDI托管bean的数据,java,jsf,jakarta-ee,primefaces,cdi,Java,Jsf,Jakarta Ee,Primefaces,Cdi,我有以下情况: 我有一个JSF对话框,里面有一些制表器。对话框中有OK按钮。如果单击“确定”,制表器中的所有数据应保存在一个事务中。问题是每个制表器都有关联的CDI会话范围的支持bean,每个支持bean都有save方法,可以借助无状态EJB保存特定制表器的数据 如何将所有与EJB相关的代码保存在一个事务中 我已经知道: 有状态EJB。这个方法需要重写statelesejb调用,并将它们委托给有状态EJB。 编写保存数据的全局无状态EJB此方法需要来自每个会话bean的数据 制表器CDI会话支持

我有以下情况:

我有一个JSF对话框,里面有一些制表器。对话框中有OK按钮。如果单击“确定”,制表器中的所有数据应保存在一个事务中。问题是每个制表器都有关联的CDI会话范围的支持bean,每个支持bean都有save方法,可以借助无状态EJB保存特定制表器的数据

如何将所有与EJB相关的代码保存在一个事务中

我已经知道:

有状态EJB。这个方法需要重写statelesejb调用,并将它们委托给有状态EJB。 编写保存数据的全局无状态EJB此方法需要来自每个会话bean的数据 制表器CDI会话支持bean可能会在其他地方重用。所以它应该是独立的。 你认为什么是好方法

编辑:伪代码:

@SessionScoped
class BackingBeanTab1 {
   //CDI session scoped bean for Info in Tab1
   String firstname;
   String lastname;

   @Inject StatelessTab1DAO dao1;

   public void save () {
      dao1.save(..);
   }
}

@Stateless
class StatelessTab1DAO {
   public void save (...);
}

Similar for Tab2 ...

@SessionScoped
class BackingBeanTab2 {
   //CDI session scoped bean for Info in Tab1
   int debit;

   @Inject StatelessTab2DAO dao1;
   public void save();
}

@Stateless
class StatelessTab2DAO {
   public void save (...);
}

通过这种设计,我可以重用每个制表器。但是,在一个事务中保存哪些好的数据呢?

这取决于您的应用程序,但一般来说,选项卡中的数据应该保存在临时存储会话或状态完整bean中,然后保存在对话框的“确定”按钮上。至少可以有几个选择:

使用有状态bean作为facade facade实现了无状态bean的所有方法,并将数据存储在其变量中,单击OK按钮后,它将调用facade上的save方法,facade将调用每个无状态会话bean来保存数据—所有这些都在一个事务中保存或回滚

将http会话用于临时存储 这是你目前的设计,我相信从描述。但您的支持bean应该只在会话中保存数据,而不是将其保存到数据库中,因为我的理解是,必须填充所有选项卡才能使数据有效。单击“确定”按钮后,您可以使用:

UserTransaction对象开始事务,使用所需数据调用所有会话bean,然后提交事务


或者创建一个无状态facade并使用所有必需的数据调用此facade,这些数据将调用所有其他会话bean(如有状态示例中的会话bean),并让容器处理事务管理。

如果您想在其他路径中编写代码,则可以尝试此方法


对于每个cdi验证,您可以使用ajax调用,因此在填充表中的数据时,插入的数据将进行相应的验证。要在一个事务中保存数据,您可能需要在ejb bean中使用cmt或bmt事务,如果您使用bmt,则启动事务和提交事务应由开发人员完成。谢谢你的回答!数据存储在CDI会话范围的bean中。我用一个例子更新了我的问题。@JohnN我的答案是否足够清楚,或者你需要更多的解释?