目前,我在 每个 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 } }); ....
这种方法至少应该照顾好您要消除的重复项,并且有足够的扩展空间来处理特定的异常等。