例子:在service中public void saveUsers(){
for(int i=0;i<10;i++){
User user = new User();
user.setName("chen"+i);
user.setDis("dis"+i);
userDao.saveUser(user);
}
}
dao中public void saveUser(User user){
RandomExceprion.run();
this.getHibernateTemplate().save(user);
}
这样的使用spring事务的时候当10次DAO操作的时候只要一次不成功的话就会不执行。
那我就不明白了,DAO层的this.getHibernateTemplate()不是会每次打开一个session,操作完成的话就关闭
那不可能实现回滚。就是有几个成功都会跟新到数据库,而我打断点砍了下,执行成功并没有展现到数据库,证明10个DAO操作是在一个session中,一个transation中。到底spring 通过什么方式实现这个的。有哪位帮我解答下。而对于opensessioninview 和transation上述实现的不同在哪?

解决方案 »

  1.   

    我觉得这和spring没有关系DAO层中调用的this.getHibernateTemplate()是获取的一个模板。DAO中的session和业务类中的session不是同一个你应该看看this.getHibernateTemplate()这个方法是怎么实现的以及它里面的方法是如何获取session的
      

  2.   

    那我搞不懂了DAO中的session和业务类中的session区别是什么
      

  3.   

    一直不用Spring 我不想再猜些什么了 不过强调几点 1.Spring是面向切面的 谁知道你在调用方法的前后Spring都做了什么 比如在方法开始前 开启事务 方法结束后 提交事务?2.Spring来管理对象 想要一个对象有你想要的效果 前提是该对象是由Spring生成或者创建的 而不是你自己new出来一个就有你想要的功能了 
      

  4.   

    看看dao类继承的那个父类的源码。就是spring提供的名叫HibernateSupport...Dao啥的那个组件。
      

  5.   

    很少用ssh一起上,能想起一半来就不错了,剩下的Alt+?搞定
      

  6.   

    你用了事务啊   就要有事务提交啊   tran.commit();
      

  7.   

    这样的使用spring事务的时候当10次DAO操作的时候只要一次不成功的话就会不执行。
    那我就不明白了,DAO层的this.getHibernateTemplate()不是会每次打开一个session,操作完成的话就关闭
    那不可能实现回滚。就是有几个成功都会跟新到数据库,而我打断点砍了下,执行成功并没有展现到数据库,证明10个DAO操作是在一个session中,一个transation中。到底spring 通过什么方式实现这个的。有哪位帮我解答下。而对于opensessioninview 和transation上述实现的不同在哪? 你理解错了吧DAO层的this.getHibernateTemplate()不是会每次打开一个session,操作完成的话就关闭,是这样的,但是spring事务的时候当10次DAO操作的时候  你就有10个save,这样只要你没有事务提交,那都没写到数据库,只是写到缓存,10个其中有错的时候,他就不会提交。
      

  8.   

    如果你是用了ssh。 那么 hibernate 是由 HibernateTransactionManager 来管理事务的。而在SSH中,事务配置一般是把HibernateTransactionManager 交给spring 来代理管理事务的。 也就是说事务管理与你说的hibernate session 无关了。