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

时间:2014-06-10 21:18:38

标签: java jsf java-ee primefaces cdi

我有以下情况:

我有一个JSF Dialog(Primefaces),里面有一些制表符。对话框有“确定”按钮。如果单击“确定”,则表格中的所有数据都应保存在一个事务中。问题是每个制表符都有关联(CDI)会话范围的支持bean,并且每个支持bean都有“保存”-Method以在无状态EJB的帮助下保存特定制表符的数据。

我该怎么做才能将所有与EJB相关的代码保存在一个事务中。

我已经知道的事情:

  1. 有状态EJB。 (此方法需要重写stateles EJB调用并将它们委托给有状态EJB)。
  2. 编写保存数据的全局无状态EJB(此方法需要来自每个会话bean的数据)
  3. 制表符(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 (...);
    }
    

    通过这种设计,我可以重用每个制表机。但是,在一次交易中可以保存哪些好的可能性呢?

2 个答案:

答案 0 :(得分:0)

这取决于您的应用程序,但通常来自选项卡的数据应保存在临时存储(会话或状态bean)中,然后保存在对话框的OK按钮上。可能至少有几个选项:

  • 使用有状态bean作为外观

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

  • 使用http会话进行临时存储

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

用于开始事务的UserTransaction对象,使用所需数据调用所有会话bean以及提交事务

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

答案 1 :(得分:0)

如果你想在其他路径上编码而不是尝试这个,

对于每个cdi验证,您可以使用ajax调用,因此在填充表中的数据时,插入的数据将相应地进行验证。对于在一个事务中保存数据,您可能需要在ejb bean中使用cmt或bmt事务并且如果使用bmt比启动事务和提交事务应该由开发人员onle

完成