spring中hibernate的事务回滚

YY爱CC 2014-01-12 02:57:49
项目架子:servlet+spring+hibernate+oracle
那个Action大致是这样的,这里面涉及到两个数据的插入,一个是merchantDAO.save(merchant);一个是userDAO.save(user);我想用spring事务控制,如果user插入失败,则之前插入的merchant回滚,我试了试,没实现,估计是我配置文件没写对。
package action.merchant;
public class AddMerchantAction extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

ApplicationContext ctx = SpringInitListener.getCtx();

//添加商户
MerchantInfoDAO merchantDAO = MerchantInfoDAO.getFromApplicationContext(ctx);
MerchantInfo merchant = new MerchantInfo();

merchantDAO.save(merchant);

//添加User
UserInfoDAO userDAO = UserInfoDAO.getFromApplicationContext(ctx);
UserInfo user = new UserInfo();
userDAO.save(user);

}
}


配置文件代码大致如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
">

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url" value="jdbc:oracle:thin:@192.166.68.42:1521:ctccpos"></property>
<property name="username" value="ctcc"></property>
<property name="password" value="oracle"></property>
<property name="maxActive" value="1000" />
<property name="maxIdle" value="50" />
<property name="minIdle" value="20" />
<property name="maxWait" value="1000" />
<property name="defaultAutoCommit" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="1200000" />
<property name="minEvictableIdleTimeMillis" value="1800000" />
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="1000"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">util.CustomerDialect</prop>
<prop key="hibernate.connection.charSet">GBK </prop>
<prop key="hibernate.connection.characterEncoding">GBK </prop>
<prop key="myeclipse.connection.profile">OracleThin Conn </prop>
</props>
</property>
<property name="mappingResources">
<list>
</list>
</property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* action..*.*(..))" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.sql.BatchUpdateException"/>
<tx:method name="*" propagation="REQUIRED" rollback-for="java.sql.BatchUpdateException"/>
</tx:attributes>
</tx:advice>
</beans>
...全文
147 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
poooll 2014-01-13
  • 打赏
  • 举报
回复
你这action又是扩展HttpServlet ,又是dopost的。这个不是servlet啊。
  • 打赏
  • 举报
回复
你是不是在DAO层处理的异常,应该向上抛出异常,或者在DAO层不Try Catch异常
YY爱CC 2014-01-12
  • 打赏
  • 举报
回复
DAO下的save方法都是spring反向生成的,类似:
	public void save(MerchantInfo transientInstance) {
		log.debug("saving MerchantInfo instance");
		try {
			getHibernateTemplate().save(transientInstance);
			log.debug("save successful");
		} catch (RuntimeException re) {
			log.error("save failed", re);
			throw re;
		}
	}
YY爱CC 2014-01-12
  • 打赏
  • 举报
回复
引用 3 楼 NNTT2010 的回复:
我看了下,配置文件没什么问题,,楼主你确定报了java.sql.BatchUpdateException这个异常后不回滚?!要不配置文件中干脆把这个异常去掉试试。
恩,不回滚,配置文件去掉那个rollback-for也一样。
长笛党希望 2014-01-12
  • 打赏
  • 举报
回复
我看了下,配置文件没什么问题,,楼主你确定报了java.sql.BatchUpdateException这个异常后不回滚?!要不配置文件中干脆把这个异常去掉试试。
waterandsky100 2014-01-12
  • 打赏
  • 举报
回复
引用 1 楼 waterandsky100 的回复:
请把你save的添加商户和添加user的动作抽取到一个方法里面,然后加上事务 @Transactional 例如 @Transactional private void save(){ //添加商户 //添加user } 希望你能成功,具体可以看下百度下事务。
不好意思 得写成public 的 因为事务特性 private时候不能识别
waterandsky100 2014-01-12
  • 打赏
  • 举报
回复
请把你save的添加商户和添加user的动作抽取到一个方法里面,然后加上事务 @Transactional 例如 @Transactional private void save(){ //添加商户 //添加user } 希望你能成功,具体可以看下百度下事务。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧