处理Hibernate事务

Thr*_*eaT 9 java hibernate transactions java-ee

目前我在每个 Controller方法中复制了这些代码:

Transaction transaction = HibernateUtil.getSessionFactory().getCurrentSession().getTransaction();
if (!HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().isActive()) {
    transaction.begin();
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法,还是有更好的方法,也许在我可以参考的单独的课程中?如果是这样,怎么样?每当我试图将它放在一个单独的类中并从其他类引用它时,它就失败了.

编辑:我正在尝试使用尽可能少的外部库.如果Java在JDK中内置了ORM/JPA实现,我就不会使用Hibernate

Pet*_*ton 7

我自己多次碰到这个.通常我的第一个建议是Spring事务管理,但我知道你试图限制你正在使用的第三方库的数量.

由于您在HibernateUtil类中使用静态API,您可能会发现在方法中合并逻辑并在回调中放置"您想要在事务中执行的操作"代码(这会将控制器变为控制器)会很有帮助.

首先,定义一个接口来描述每个控制器的inTransaction行为:

public interface TransactionCallback {
    void doInTransaction();
}
Run Code Online (Sandbox Code Playgroud)

现在,在HibernateUtil类中创建一个静态方法来处理开始,提交,并在必要时回滚您的事务:

public class HibernateUtil {
    public static void inTransaction(TransactionCallback tc) {
        Transaction transaction = HibernateUtil.getSessionFactory().getCurrentSession().getTransaction();
        if (!HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().isActive()) {
            transaction.begin();
            try {
                tc.doInTransaction();
                transaction.commit();
            } catch (Exception e) {
                transaction.rollback();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的控制器中,你将使用一个匿名内部类的新方法:

....
    HibernateUtil.inTransaction(new TransactionCallback() {
        void doInTransaction() {
            // do stuff for this controller
        }
    });
....
Run Code Online (Sandbox Code Playgroud)

这种方法至少应该处理你想要消除的重复,并且有足够的空间来扩展它以处理特定的异常等.