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
我自己多次碰到这个.通常我的第一个建议是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)
这种方法至少应该处理你想要消除的重复,并且有足够的空间来扩展它以处理特定的异常等.
| 归档时间: |
|
| 查看次数: |
2054 次 |
| 最近记录: |