我有以下情况:
我有一个JSF Dialog(Primefaces),里面有一些制表符。对话框有“确定”按钮。如果单击“确定”,则表格中的所有数据都应保存在一个事务中。问题是每个制表符都有关联(CDI)会话范围的支持bean,并且每个支持bean都有“保存”-Method以在无状态EJB的帮助下保存特定制表符的数据。
我该怎么做才能将所有与EJB相关的代码保存在一个事务中。
我已经知道的事情:
制表符(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 (...);
}
通过这种设计,我可以重用每个制表机。但是,在一次交易中可以保存哪些好的可能性呢?
答案 0 :(得分:0)
这取决于您的应用程序,但通常来自选项卡的数据应保存在临时存储(会话或状态bean)中,然后保存在对话框的OK按钮上。可能至少有几个选项:
您的facade实现了无状态bean的所有方法并将数据存储在其变量中,一旦单击OK按钮,它就会调用facade上的save方法,facade调用每个无状态会话bean来保存数据 - 所有这些都保存在一个事务中或者回滚。
这是您当前的设计,因为我从描述中相信。但是你的支持bean应该只将数据保存在会话中,而不是将其保存到数据库中(因为我的理解是必须填充所有选项卡才能使数据有效)。然后,当单击“确定”按钮时,您可以使用:
用于开始事务的UserTransaction对象,使用所需数据调用所有会话bean以及提交事务
或创建一个无静态外观,并使用所有必需的数据调用此外观(这将调用所有其他会话bean,如在有状态示例中),并让容器处理事务管理。
答案 1 :(得分:0)
如果你想在其他路径上编码而不是尝试这个,
对于每个cdi验证,您可以使用ajax调用,因此在填充表中的数据时,插入的数据将相应地进行验证。对于在一个事务中保存数据,您可能需要在ejb bean中使用cmt或bmt事务并且如果使用bmt比启动事务和提交事务应该由开发人员onle
完成