Java 回滚所有以前的hibernate事务

Java 回滚所有以前的hibernate事务,java,spring,hibernate,hibernate-criteria,rollback,Java,Spring,Hibernate,Hibernate Criteria,Rollback,我有两个表,我正在使用hibernate保存数据。如果最后一个表在保存过程中出现错误,我希望从所有表回滚事务 例如,我有两个表,分别命名Term和card acceptor,并将数据逐个保存在其中。以下是两个表的功能: @Autowired private SessionFactory sessionFactory; Transaction tx = null; public SessionFactory getSessionFactory() { return sessionFac

我有两个表,我正在使用hibernate保存数据。如果最后一个表在保存过程中出现错误,我希望从所有表回滚事务

例如,我有两个表,分别命名Term和card acceptor,并将数据逐个保存在其中。以下是两个表的功能:

@Autowired
private SessionFactory sessionFactory;

Transaction tx = null;

public SessionFactory getSessionFactory() {
    return sessionFactory;
}

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}
@Override
public TmCardAcceptor saveCardAcceptor(TmCardAcceptor cardAcceptor) {
    // TODO Auto-generated method stub

    // Acquire session
    Session session = sessionFactory.openSession();
    // Save employee, saving behavior get done in a transactional manner
    //session.save(cardAcceptor); //previous method
    try {


        tx = session.beginTransaction();
        session.save(cardAcceptor); 
        tx.commit();


    } catch (HibernateException e) {
        try{
        tx.rollback();
    }catch(RuntimeException rbe){
    }
    throw e;
    } finally{
        if(session!=null){
            session.close();
        }
    }

    return cardAcceptor;        

}

@Override
public Term saveTerm(Term term) {
    // TODO Auto-generated method stub

    // Acquire session
    Session session = sessionFactory.openSession();
    // Save employee, saving behavior get done in a transactional manner
    //session.save(cardAcceptor); //previous method
    try {


        tx = session.beginTransaction();
        session.save(term); 
        tx.commit();


    } catch (HibernateException e) {
        try{
            System.out.println("Rolling back Term");
        tx.rollback();
    }catch(RuntimeException rbe){
    }
    throw e;
    } finally{
        if(session!=null){
            session.close();
        }
    }

    return term;        

}

如果术语表中有错误,则此代码不会回滚卡接受者。。请帮助,如何实现这一点…

我想你误解了交易系统

一笔交易应该是


一旦您提交了事务,更改就完成了,您必须手动撤消它。如果要链接术语和CardAcceptor,则只需打开一个事务,保存两个对象,然后提交。

是否有一个方法同时调用这两个方法?@XtremeBaumer是,这两个方法都是从另一个类的同一个函数调用的。然后在该方法内处理事务OHK@XtremeBaumer,那么你的意思是我应该使用该方法进行回滚吗?是的,你只能回滚事务,除非它们已提交
。还有事务嵌套,但这可能会变得非常复杂,尤其是在手动处理时。当您使用hibernate和spring时,请研究事务性。它可以使生活更加轻松,因此两个不同的事务不能回滚?事务1的回滚不应影响事务2的结果,您的工作必须是原子的。在某些情况下,当您处理多个源(例如一个数据源的两个不同数据源和一个JMS连接)时,您希望事务1和事务2立即提交或回滚。然后,您必须使用外部事务管理器并使用功能。但这不是你的情况