处理Hibernate事务 [英] Handling Hibernate Transactions
问题描述
目前我在每个中都有一个重复的代码,它们是我的一个Controller方法:
事务事务= 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();
$ b现在,在HibernateUtil类中创建一个静态方法来处理开始,提交,如果需要回滚你的交易:
$ p $ public class HibernateUtil {
public static void inTransaction(TransactionCallback tc){
Transaction transaction = HibernateUtil.getSessionFactory()。getCurrentSession()。getTransaction();
if(!HibernateUtil.getSessionFactory()。getCurrentSession()。getTransaction()。isActive()){
transaction.begin();
尝试{
tc.doInTransaction();
transaction.commit();
} catch(Exception e){
transaction.rollback();
$ b 在你的控制器,你会用一个匿名的内部类来使用你的新方法:
....
HibernateUtil。 inTransaction(new TransactionCallback(){
void doInTransaction(){
//为这个控制器做些什么
}
});
....
这种方法至少应该处理重复喜欢消除,并且有足够的空间来扩展它以处理特定的异常情况等。
Currently I have this code duplicated in each one of my Controller methods:
Transaction transaction = HibernateUtil.getSessionFactory().getCurrentSession().getTransaction();
if (!HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().isActive()) {
transaction.begin();
}
Is this the correct way or is there a better way of doing this, perhaps in a separate class that I can reference? If so, how? Every time I've tried to put it in a separate class and reference it from other classes, it failed.
edit: I'm trying to use as few external libraries as possible. I wouldn't use Hibernate if Java had an ORM/JPA implementation built into the JDK
解决方案 I've run into this myself many times. Ordinarily my first recommendation would be Spring transaction management, however I understand you are trying to limit the number of third party libraries you are using.
Since you're using a static API in your HibernateUtil class, you may find it helpful to consolidate your logic in a method, and putting the 'what you want to do in a transaction' code (which varies controller to controller) in a callback.
First, define an interface to describe each controller's inTransaction behavior:
public interface TransactionCallback {
void doInTransaction();
}
Now, create a static method in your HibernateUtil class to handle beginning, committing, and if necessary rolling back your transactions:
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();
}
}
}
}
In your controller, you'd use your new method with an anonymous inner class:
....
HibernateUtil.inTransaction(new TransactionCallback() {
void doInTransaction() {
// do stuff for this controller
}
});
....
This approach should at least take care of the duplication you'd like to eliminate, and there's plenty of room for extending it to handle particular exceptions, etc.
这篇关于处理Hibernate事务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!