我的工程中事务采用spring声明式事务,配置如下:
<bean id="souDAO"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref bean="souDAOBase" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*save*">PROPAGATION_REQUIRED</prop>
<prop key="*add*">PROPAGATION_REQUIRED</prop>
<prop key="*update*">PROPAGATION_REQUIRED</prop>
<prop key="*delete*">PROPAGATION_REQUIRED</prop>
<prop key="*write*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean> 在我的service中有方法如下:
public void merImportadd1(MMmsMchntInfTmp mmmsmchntinftmp,MRequest mRequest,MAudit mAudit) throws Exception
{
souDao.save(mmmsmchntinftmp);
souDao.save(mRequest);
mAudit.setRequetid(mRequest.getRequestid());
souDao.save(mAudit);
}
运行时,此行抛出异常:souDao.save(mRequest);
但此行调用成功:souDao.save(mmmsmchntinftmp); 数据库中保存成功。
控制台异常如下:
13:11:29,109 ERROR JDBCExceptionReporter : Data truncation: Data too long for column 'operator' at row 1
13:11:29,109 ERROR AbstractFlushingEventListener : Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:993)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:340)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:540)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:510)
at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:275)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy1.save(Unknown Source)
at com.service.Mer.MerTmpServiceImpl.merImportadd1(MerTmpServiceImpl.java:58)
第一个save方法执行成功,第二个save方法执行失败,但查看数据,第一个save保存的数据已经存在,的就是说,事务没有起作用,没有回滚。看了其它配置,都没发现什么问题。请问各位大侠,是哪方面原因?
<bean id="souDAO"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref bean="souDAOBase" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*save*">PROPAGATION_REQUIRED</prop>
<prop key="*add*">PROPAGATION_REQUIRED</prop>
<prop key="*update*">PROPAGATION_REQUIRED</prop>
<prop key="*delete*">PROPAGATION_REQUIRED</prop>
<prop key="*write*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean> 在我的service中有方法如下:
public void merImportadd1(MMmsMchntInfTmp mmmsmchntinftmp,MRequest mRequest,MAudit mAudit) throws Exception
{
souDao.save(mmmsmchntinftmp);
souDao.save(mRequest);
mAudit.setRequetid(mRequest.getRequestid());
souDao.save(mAudit);
}
运行时,此行抛出异常:souDao.save(mRequest);
但此行调用成功:souDao.save(mmmsmchntinftmp); 数据库中保存成功。
控制台异常如下:
13:11:29,109 ERROR JDBCExceptionReporter : Data truncation: Data too long for column 'operator' at row 1
13:11:29,109 ERROR AbstractFlushingEventListener : Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:993)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:340)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:540)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:510)
at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:275)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
at $Proxy1.save(Unknown Source)
at com.service.Mer.MerTmpServiceImpl.merImportadd1(MerTmpServiceImpl.java:58)
第一个save方法执行成功,第二个save方法执行失败,但查看数据,第一个save保存的数据已经存在,的就是说,事务没有起作用,没有回滚。看了其它配置,都没发现什么问题。请问各位大侠,是哪方面原因?
解决方案 »
- hibernate 4 中为什么提示找不到Configuration类
- 【struts2】struts.xml配置的问题,可能对你来说很简单..
- 紧急求助:weblogic如何绑定特定域名?
- 请问如何实现文件上传?
- 哪位大侠帮忙写一个EJB获取和发送消息队列的小程序
- 急!急!急!struts项目中引用iframe的一个问题,高手帮帮忙啊!
- [討論]使用Struts框架,結合Jsp和標簽庫實現頁面多語言化
- 我想开发一个类csdn的论坛,有没有必要用到ejb。
- 那位有这个包:javax.transaction.UserTransaction或它的下载地址?
- jb8输入中文时死机。
- 急 系统处理越来越慢怎么回事?
- ★struts 标签问题?
souDao.save(mmmsmchntinftmp);
souDao.save(mRequest);
是第一行执行成功,第二行执行失败,问题是:第一行的执行没有回滚。
不用关心提示:Data too long for column 'operator' at row, 这个是我故意设置对象属性长度超过数据库字段长度的,就是因为这个才执行失败的。
public void save(final Object entity) throws DAOException {
try {
getHibernateTemplate().save(entity);
} catch (HibernateException he) {
log.debug(he.getCause());
throw DAOException.getInstance(he.getCause());
}
}我的DAOException
public class DAOException extends RuntimeException {
......
}