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
我试图了解事务管理,并尝试在我现有的使用 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