Java 使用多个EJB在一个事务中保存来自CDI托管bean的数据
我有以下情况: 我有一个JSF对话框,里面有一些制表器。对话框中有OK按钮。如果单击“确定”,制表器中的所有数据应保存在一个事务中。问题是每个制表器都有关联的CDI会话范围的支持bean,每个支持bean都有save方法,可以借助无状态EJB保存特定制表器的数据 如何将所有与EJB相关的代码保存在一个事务中 我已经知道: 有状态EJB。这个方法需要重写statelesejb调用,并将它们委托给有状态EJB。 编写保存数据的全局无状态EJB此方法需要来自每个会话bean的数据 制表器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会话支持
@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我的答案是否足够清楚,或者你需要更多的解释?