EJB 3.0 和休眠中的事务管理

Transaction management in EJB 3.0 and hibernate

我试图了解事务管理,并尝试在我现有的使用 Struts 2、EJB 3 和 hibernate 5.2 开发的应用程序中使用它的功能。 现在我的业务层中有 ejb,如下所示

   @Stateless
    @TransactionManagement(TransactionManagementType.CONTAINER)
    public class MyEJb implements ejbxyz {

    @Override
    public void method(){
          Dao dao=new Dao() //Dao class is simple java class
          dao.fooMethod();  //this method updates some record
          dao.barMethod();  // this method updates some other record
        }
    } 

    public class Dao{
         fooMethid(){
         Session session=sessFactory.openSession();
          session.beginTransaction();
         session.update(x);
              }
         barMethod(){
              try{
                   Session session=sessFactory.getCurrentSession();
                    session.getNamedQuery("xyz").executeUpdate();

                }catch(HibernateException ex){
                    session.getTransaction.rollback();
                } 
             }
           }

我知道事务管理应该在服务层完成(在我的例子中是在 ejb)。但是我怎样才能在那里实现这一目标。 ?

现在的依赖是,如果 barMethod() 无法更新记录,那么我需要回滚在 fooMethod 中所做的更改。所以基本上我需要在一个事务中完成这两种方法。 当我执行应用程序时,它会抛出以下异常

Exception while barMethod getNamedQuery is not valid without active transaction

这是因为我没有在 barMethod 中开始任何交易。但是后来我真的不想开始一个新的交易,而是想继续在 fooMethod 中开始的旧交易。

EJB bean 确实支持容器管理的事务。但是,您的 Dao class 不是托管 bean - 它是您手动实例化的常规 pojo - 因此它不参与由您的其他 ejb 启动的任何事务。 因此,将您的 Dao 移动到单独的文件中,使用 @Stateless 对其进行注释,然后使用 @EJB private Dao dao;
将其注入到您的服务中 不过,Ejb 容器中的事务还有更多内容。您可以通过 @TransactionAttribute 注释在方法级别控制事务支持,该注释指定容器应如何调用有关事务的方法。这样你就可以控制你的方法是否需要它自己的事务,或者它是否应该参与调用者发起的事务(例如,当从 ejb bean 调用时)。有关更多信息,请查看官方 Java EE tutorial