gpt4 book ai didi

java - EJB 3.0 和 hibernate 中的事务管理

转载 作者:行者123 更新时间:2023-11-30 06:41:08 24 4
gpt4 key购买 nike

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

关于java - EJB 3.0 和 hibernate 中的事务管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44353851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com