我本人已经遇到了很多次。通常,我的第一个建议是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
}
});
....
这种方法至少应该照顾好您要消除的重复项,并且有足够的扩展空间来处理特定的异常等。