Java 如果一个事务在多个到不同表的事务中失败,在hibernate中是否可以回滚?

Java 如果一个事务在多个到不同表的事务中失败,在hibernate中是否可以回滚?,java,hibernate,Java,Hibernate,我有一个方法: // methods private void transform(TransformList transformList) { TableA tA = transformList.getTableA(); TableB tB = transformList.getTableB(); TableC tC = transformList.getTableC(); daoObj.saveA(tA); daoObj.saveB(

我有一个方法:

    // methods
    private void transform(TransformList transformList) {
    TableA tA = transformList.getTableA();
    TableB tB = transformList.getTableB();
    TableC tC = transformList.getTableC();

    daoObj.saveA(tA);
    daoObj.saveB(tB);
    daoObj.saveC(tC);
    }
现在,

同样地

    //saveB mehtod
    public void saveB(TableB tB)  {
    Session session = Context.getHibernateSession();
    try {
    if(session != null) {
    Transaction tx = session.beginTransaction();
    tx.begin();
    session.merge(tB);
    tx.commit();
    }       
    }catch (Exception e) {
    tx.rollback();
    throw new SomeException(e.getMessage());
    }
    finally{
    if (session != null) {
    session.clear();
    }
    }
    }
以及

现在在调用“transform”方法时,如果saveA和saveB方法成功,那么 saveC方法中发生异常,是否可以回滚TableA和TableB记录
(已提交的)以及TableC记录?

否。您必须将事务处理至少提高一个级别:创建事务,并在该事务中调用saveA()、saveB()和saveC()。不要在save方法内处理事务


当然,这只是一种可能性。有一些框架,比如Spring,可以极大地帮助您管理事务。

那么我应该将common Session对象也传递给所有3种方法吗?如果您需要它(从代码上看,它看起来像它),是的,您必须将Session作为参数传递,但如果我使用PreparedStatement并在方法saveB中执行批处理更新,那么是否也可以同时回滚TableA和TableB?我这里没有使用Spring或EJB。只有在一个事务中更新(或插入或删除)的所有内容都将回滚时才使用Hibernate。但是请记住,只有数据库中的数据才会回滚。您对Java对象所做的更改将不会生效。如果我使用单个会话更新到多个表中,并且数据量很大,会话是否有可能溢出?
    //saveB mehtod
    public void saveB(TableB tB)  {
    Session session = Context.getHibernateSession();
    try {
    if(session != null) {
    Transaction tx = session.beginTransaction();
    tx.begin();
    session.merge(tB);
    tx.commit();
    }       
    }catch (Exception e) {
    tx.rollback();
    throw new SomeException(e.getMessage());
    }
    finally{
    if (session != null) {
    session.clear();
    }
    }
    }
        //saveC mehtod
        public void saveC(TableC tC)  {
        Session session = Context.getHibernateSession();
        try {
        if(session != null) {
        Transaction tx = session.beginTransaction();
        tx.begin();
        session.merge(tC);
        tx.commit();
        }       
        }catch (Exception e) {
        tx.rollback();
        throw new SomeException(e.getMessage());
        }
        finally{
        if (session != null) {
        session.clear();
        }
        }
        }