hibernate 事务
一. 你理解事务有问题,它并不是让你的sql可不可以执行。就说事务的原子性,即可以说事务是数据库查询的基本单元(而不是一条语句),要么在事务的语句全部执行,或者全部都不执行。
比如:现在我需要删除一个班级Class记录,和这个班级对应的全部学生Student记录。那么我就应该写两条删除语句delete from Student where cid = ?和delete from Class where cid = ?
如没有事务处理,这时候出现删除学生没问题,但是删除班级出现问题,那么就会出现班级记录的冗余数据,使得数据库数据的不完整性。这是不愿意看到的。
如果加了事务处理呢,一条语句出错,就会进行事务回滚,使得全部恢复操作之前的数据,这就是要么全部执行,要么都不执行,保证数据的完整性。
二. hibernateTemplate的问题
hibernateTemplate是spring中的hibernate操作模板,它封装了session,那么session对象是什么时候关闭的呢。
如果使用了数据源(数据源肯定要使用的),那么session是不会关闭的(session就是jdbc的connection),而只是会有一个false赋值给一个包含有session的一个内部类(相当于C语言的结构体,c3p0是这么做的,其他数据源包应该也差不多)表明这个session是空闲的
那么什么时候会使当前的session标识空闲呢,这个就要看你的spring配置文件是怎么配置的了。一般在spring都是使用aop的事务管理,具体,你可以去看下这方面的知识点。比如一下(aop事务管理不完整片段)
<aop:config>
<aop:pointcut id="bussinessService"
expression="(execution(public * com.study.service..*.*(..)))" />
<aop:advisor pointcut-ref="bussinessService"
advice-ref="txAdvice" />
</aop:config>
hibernateTemplate自身封装了session.beginTransaction(),和session.save()等相关事务操作的
话,在dao层使用hibernateTemplate.save()后,由service层调去这个方法,为什么配置文件中还要加入aop的事务管理,
这些配置不是给service层的方法加上事务操作吗,这样在service层的相关方法上岂不是用双重事务管理?
hibernateTemplate自身封装了session.beginTransaction(),你可以显式开启事务。就和session或jdbc一样。这是没有问题的。在spring中提供了aop事务管理,使关于事务这种重复性很大的代码抽离出来。所以这两种方法都可以使用,但是并不意味着你就要把这两种都用上,取其一。
2024-07-18 广告