Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate 3的两个事务问题_Java_Hibernate_Hibernate3 - Fatal编程技术网

Java Hibernate 3的两个事务问题

Java Hibernate 3的两个事务问题,java,hibernate,hibernate3,Java,Hibernate,Hibernate3,在我们的应用程序中,我们使用的是Hibernate3。最近我在交易中遇到了一个问题。我有以下方式的一些代码 method1() try{ tx = session.beginTransaction(); //New object which needs to be stored session.save(object); // Some code which generates exception tx.commit(); // Excep

在我们的应用程序中,我们使用的是Hibernate3。最近我在交易中遇到了一个问题。我有以下方式的一些代码

    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();
    }
    }
我有另一个与此相同的方法,它在这个方法之后调用,即使在这个方法抛出异常的情况下也是如此

会话在两种方法中都是相同的

现在我所经历的是,如果我的第二个方法成功执行并提交hibernate事务,这将存储在我不想要的第1个方法中保存的数据

我不能分享确切的代码,但准备了一个类似于本期的测试方法。我的数据库服务器是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();
        }
    }

}

任何帮助都将不胜感激。

我终于找到了这个问题的解决方案。在开始另一个事务/操作之前,可以使用session.clear()从会话中删除所有挂起的保存/更新/删除操作

因此,在最后的回滚中,只需添加session.save()


感谢您的回复。

您从哪里调用第二个方法?从方法1执行后粘贴的代码中,它将在调用第二个方法之前提交方法1中的更改。在提交事务之前,如果抛出异常,它如何将数据保存在我的数据库中?这两个方法都是simmiler,调用方类从try执行method1,从finally执行method2。提交事务后关闭会话,我认为这就是为什么第二个方法存储第一个方法存储的数据。