我在非EJB环境中使用Hibernate。我知道在使用EJB时有几个Transation Annotations。但Hibernate Documentation似乎并未讨论所有这些情况。我想知道的是运行代码时
try {
factory.getCurrentSession().beginTransaction();
// Do some work
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
factory.getCurrentSession().getTransaction().commit();
}
catch (RuntimeException e) {
factory.getCurrentSession().getTransaction().rollback();
throw e; // or display error message
}
会发生什么事情已经运行了?(将创建新事务还是将使用现有事务。如果是后者,我如何实现前者,反之亦然?) 如何使用Hibernate实现与不同EJB注释相同的功能?
答案 0 :(得分:2)
The javadoc of beginTransaction()
说:
开始一个工作单元并返回关联的Transaction对象。如果需要新的基础事务,则开始事务。否则,在现有基础事务的上下文中继续新工作。
当且仅当底层事务是由此对象启动时,此方法才会提交基础事务。
也就是说,在代码中明确地管理事务和异常是一件痛苦的事情,并降低了代码的可读性。我会使用Spring在非EJB环境中解决这个问题。