squall2825 2009-01-07 12:44
浏览 217
已采纳

Spring高手进来看看

application.xml代码
<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="*">PROPAGATION_REQUIRED,-DaoAccessException</prop>
<prop key="get*">PROPAGATION_REQUIRED,ISOLATION_READ_UNCOMMITTED,readOnly</prop>
</props>
</property>
</bean>

DaoAccessException.java代码
public class DaoAccessException extends RuntimeException{
public DaoAccessException(Throwable rooCase){
       super(rooCase);
}
public DaoAccessException(String msg){
       super(msg);
}
public DaoAccessException(String msg,Throwable rooCase){
super(msg,rooCase);
}
}

UserDaoImpl.java代码
public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
public void addUser(Object o)throws DaoAccessException{
try {
getHibernateTemplate().save(o);
throw new DaoAccessException("回滚");
} catch (Exception e) {
// TODO: handle exception
throw new DaoAccessException(e);
}
}
}

测试代码
@org.junit.Test
public void addUser() {
ApplicationContext context = new FileSystemXmlApplicationContext(
"D:\\MyEclipse 5.5.1 GA\\workspace\\SpringAndHibernate\\WebRoot\\WEB-INF\\applicationContext.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
User user = new User();
       user.setName("赵六");
try {
              userDao.addUser(user);
} catch (DaoAccessException e) {
// TODO: handle exception
e.printStackTrace();
}
}
设想中的效果是当程序执行完毕后 这个添加用户的事务操作应该回滚 可实际上却写进了数据库 这是为什么?

 


问题补充
<bean id="userDao" class="com.squall.dao.impl.UserDaoImpl">

      <property name="sessionFactory" ref="sessionFactory"></property>

</bean>
问题补充
<bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="beanNames">

<list>

<value>userDAO</value>

</list>


</property>

<property name="interceptorNames">

<value>transactionInterceptor</value>

</property>

</bean>
问题补充:
我在程序中已经做了手动的异常 也就是说其实异常已经抛出 但是程序还是将事务提交上去 我是spring初学者 不是很清楚spring如何进行自动的回滚机制 也就是说一旦发生异常了 如何让spring自动进行事务的回滚
  • 写回答

7条回答 默认 最新

  • qbqopen 2009-01-09 00:06
    关注

    你现在用的transactionInterceptor在你执行完userDao.addUser(user);后自动提交

    因为你把事务其实就是拦截器拦截在Dao层了



    userDAO



    transactionInterceptor


    这里。

    你应该把这里的dao换成service
    然后在service里调用dao的方法。。。。。。。

    UserService.java

    ....
    public int addUser(User user){
    userDao.addUser(user);
    }
    ....




    userService //注意这里,不要切在dao上,应该切在service



    transactionInterceptor

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题