在学spring,看到一个帖子,问HibernateTemplate是不是自己有事务,大家都说有。如果有,那为什么需要在Spring的配置文件中配置事务呢?看了看HibernateTemplate的代码,也看不出来

故请教大家:
HibernateTemplate中有事务处理吗?
HibernateTemplate中有事务处理,那Spring为何还需配置事务?



HibernateTemplate一般出现在DAO层。他所谓的事务一般都是针对单条SQL而言。因为HibernateTemplate中的方法都是一次执行一条SQL的。
而spring中的事务是针对service层的,因为在业务逻辑层,设计到业务时都是调用DAO层的基本方法组合实现逻辑的,比如转账,需要先扣,在增,此时对于service这属于一个动作。

举个例子吧。

比如执行单条SQL: UPDATE table_name SET name = 'xxx' WHERE id = ?

使用HibernateTemplate的update方法时,如果执行错误那么数据库是可以回滚的。

如果执行多条SQL:UPDATE table_name SET name = 'xxx' WHERE id = ?;UPDATE table_name1 SET name = 'xxx' WHERE id = ?

使用HibernateTemplate时,需要执行两次update方法,但此时就会出现错误,HibernateTemplate是不会对两条SQL的结果回滚的,可能会操成一条成功一条失败,此时就需要spring的事务了。因为两条以上的SQL就算是业务逻辑的。



HibernateTemplate没有设置session的事务属性,HibernateTemplate的作用是保证session能够正确的打开和关闭,避免手工管理session带来的问题。
可以通过下面的方式处理事务


getHibernateTemplate().execute( new  HibernateCallback() { 
               public  Object doInHibernate(Session session)  throws  HibernateException, SQLException { 
                  session.connection().setAutoCommit( false ); 
                  
                   Student stu1= new  Student(); 
                  stu1.setName( "aaaa" );                 
            session.save(stu1); 
                  
                  Student stu2 =  new  Student(); 
                  session.save(stu2); 
                  
                  session.flush(); //向数据库发送sql 
                  session.connection().commit(); 
                  return  null
             
          });