用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();
}
}
}