【发布时间】:2017-06-04 12:01:23
【问题描述】:
我正在尝试了解事务管理,并尝试在我已经存在的应用程序中使用它的强大功能,这些应用程序是用 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,它会为您启动和提交事务。所以不要在 DAO 方法中处理事务。事务由 EJB 容器自动为您处理。而且,不要使用专有的 Hibernate API。使用 JPA。
-
@JBNizet 您能否详细说明“不要使用专有的 Hibernate API。使用 JPA”。 hibernate 不是 JPA 实现吗?
-
Java EE 有一个名为 JPA 的标准规范。它定义了标准接口(EntityManager...)、方法、注释。 Hibernate 是 JPA 的一个实现。您应该使用标准 API 而不是专有的 Hibernate Session API。