Thr*_*eaT 9 java hibernate transactions java-ee
目前我在每个 Controller方法中都复制了这些代码:
Transaction transaction = HibernateUtil.getSessionFactory().getCurrentSession().getTransaction();
if (!HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().isActive()) {
    transaction.begin();
}
这是正确的方法,还是有更好的方法,也许在我可以参考的单独的课程中?如果是这样,怎么样?每当我试图将它放在一个单独的类中并从其他类引用它时,它就失败了.
编辑:我正在尝试使用尽可能少的外部库.如果Java在JDK中内置了ORM/JPA实现,我就不会使用Hibernate
我自己多次碰到这个.通常我的第一个建议是Spring事务管理,但我知道你试图限制你正在使用的第三方库的数量.
由于您在HibernateUtil类中使用静态API,您可能会发现在方法中合并逻辑并在回调中放置"您想要在事务中执行的操作"代码(这会将控制器变为控制器)会很有帮助.
首先,定义一个接口来描述每个控制器的inTransaction行为:
public interface TransactionCallback {
    void doInTransaction();
}
现在,在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();
            }
        }
    }
}
在你的控制器中,你将使用一个匿名内部类的新方法:
....
    HibernateUtil.inTransaction(new TransactionCallback() {
        void doInTransaction() {
            // do stuff for this controller
        }
    });
....
这种方法至少应该处理你想要消除的重复,并且有足够的空间来扩展它以处理特定的异常等.
| 归档时间: | 
 | 
| 查看次数: | 2054 次 | 
| 最近记录: |