在学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
;
}
});
转载于:https://blog.51cto.com/yjm199/1834453