用spring进行事务管理问题,不回滚

用spring进行事务管理,现在要执行数据保存的操作,要同时向两个表保存,一个主表一个从表,已经用hibernate关联了起来,session.save(kpgl)是一起向两个表进行存储的,数据库存储数据的时候,从表保存出现错误,主表依然存入了数据,事务并没有回滚。下面是代码和配置

 @Override
    public void save(List<KPGL> pKpglList, Result pResult) throws Exception {
        Session session = null;
        try {
            session = this.getSessionFactory().openSession();
            for(KPGL kpgl: pKpglList) {
                session.save(kpgl);
            }
        }
        catch(Exception e) {
            this.log.info(e.getMessage(), e);
            pResult.setCode(_mDbErrorCode);
            pResult.setMessage(_mDbErrorMess);
            throw e;
        }
        finally {
            if(session != null) {
                session.close();
            }
        }
    }

事务管理配置

 <!-- 事务管理 -->
    <tx:advice id="txAdviceDao" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save" propagation="REQUIRED" read-only="false" rollback-for="Exception"/>
            <tx:method name="update" propagation="REQUIRED" read-only="false" rollback-for="Exception"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="myPointcutDao" expression="execution(* com.aisino.dao.impl.*.*(..))"/>
        <aop:advisor advice-ref="txAdviceDao" pointcut-ref="myPointcutDao"/>
    </aop:config>

来个大神给解答一下呗

观望中,我也不懂,你程序运行报错了没?

使用OpenSession(),是新建一个事务,需要手动关闭和回滚 例如:
Session sess = factory.openSession();
Transaction tx;
try {
tx = sess.beginTransaction();
//do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
throw e;
}
finally {
sess.close();
}

建议你使用getCurrentSession()

用hibernate事物注解
@Transactional 加载方法上面即可,具体用法可以去查查。
如:
@Transactional
public void save(List pKpglList, Result pResult) throws Exception {
Session session = null;
try {
session = this.getSessionFactory().openSession();
for(KPGL kpgl: pKpglList) {
session.save(kpgl);
}
}
catch(Exception e) {
this.log.info(e.getMessage(), e);
pResult.setCode(_mDbErrorCode);
pResult.setMessage(_mDbErrorMess);
throw e;
}
finally {
if(session != null) {
session.close();
}
}
}