【发布时间】:2014-11-19 10:16:50
【问题描述】:
在我们的应用程序中,我们使用的是 Hibernate 3。最近我在事务中遇到了一个问题。我有以下方式的一些代码
method1()
try{
tx = session.beginTransaction();
//New object which needs to be stored
session.save(object);
// Some code which generates exception
tx.commit(); // Exception occured before commit processing
}catch(Exception ex){
e.printStackTrace();
throw e;
}finally{
if(tx!=null && tx.wasNotCommited()){
tx.rollback();
}
}
我还有一个和这个一样的方法,即使这个方法抛出异常也会在这个方法之后调用。
两种方法的会话相同。
现在我遇到的是,如果我的第二种方法成功执行并提交休眠事务,这将存储已保存在第一种方法中的我不想要的数据。
我不能分享确切的代码,但准备了一个类似于这个问题的测试方法。我的数据库服务器是mysql。
package com.opshub.jobs.core;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.opshub.dao.core.Company;
import com.opshub.utils.hibernate.HibernateSessionFactory;
public class Test {
public static void main(String[] args) throws Exception{
Session session = HibernateSessionFactory.openSession();
try{
Transaction tx = session.beginTransaction();
try{
Company company = new Company();
company.setName("Gaurav");
company.setCompanyDetails("IT Company");
company.setCompanyAddress("India");
session.save(company);
if(true)
throw new Exception("Now go to finally");
tx.commit();
}catch(Exception e){
throw e;
}finally{
tx.rollback();
}
}finally{
Transaction tx = session.beginTransaction();
tx.begin();
Company company = new Company();
company.setName("Gaurav 1");
company.setCompanyDetails("IT Company");
company.setCompanyAddress("India");
session.save(company);
// if(true)
// throw new Exception("Now go to finally");
tx.commit();
}
}
}
任何帮助将不胜感激。
【问题讨论】:
-
你从哪里调用第二种方法?从执行方法 1 后粘贴的代码中,即使在调用第二个方法之前,它也会提交方法 1 中的更改。
-
在提交事务是method1之前,如果抛出异常,它如何将数据保存在我的数据库中?两种方法都比较简单,调用者类是从try中执行method1,从finally中执行method2。
-
提交事务后关闭会话,我认为这就是为什么第二种方法存储第一种方法存储的数据的原因。
标签: java hibernate hibernate3