hibernate 事务

在hibernate中,crud的各个操作都得使用显示的声明事务,在createQuery()方法查询时就不必使用事务,那么是不是只有在save()update()del... 在hibernate中,crud的各个操作都得使用显示的声明事务,在createQuery()方法查询时就不必使用事务,那么是不是只有在save() update() delete() load()和get()方法前后加入事务机制呢?请略加讲解事务在hibernate中的使用?如果使用hibernateTemplate对象,在load()方法中,这个session对象是在什么时候关闭呢? 展开
 我来答
大胡子J
推荐于2016-03-06 · TA获得超过221个赞
知道小有建树答主
回答量:182
采纳率:0%
帮助的人:159万
展开全部

一. 你理解事务有问题,它并不是让你的sql可不可以执行。就说事务的原子性,即可以说事务是数据库查询的基本单元(而不是一条语句),要么在事务的语句全部执行,或者全部都不执行。

比如:现在我需要删除一个班级Class记录,和这个班级对应的全部学生Student记录。那么我就应该写两条删除语句delete from Student where cid = ?和delete from Class where cid = ?

  1. 如没有事务处理,这时候出现删除学生没问题,但是删除班级出现问题,那么就会出现班级记录的冗余数据,使得数据库数据的不完整性。这是不愿意看到的。

  2. 如果加了事务处理呢,一条语句出错,就会进行事务回滚,使得全部恢复操作之前的数据,这就是要么全部执行,要么都不执行,保证数据的完整性。

二. hibernateTemplate的问题

hibernateTemplate是spring中的hibernate操作模板,它封装了session,那么session对象是什么时候关闭的呢。

  1. 如果使用了数据源(数据源肯定要使用的),那么session是不会关闭的(session就是jdbc的connection),而只是会有一个false赋值给一个包含有session的一个内部类(相当于C语言的结构体,c3p0是这么做的,其他数据源包应该也差不多)表明这个session是空闲的

  2. 那么什么时候会使当前的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事务管理,使关于事务这种重复性很大的代码抽离出来。所以这两种方法都可以使用,但是并不意味着你就要把这两种都用上,取其一。
Storm代理
2023-05-09 广告
StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,IP... 点击进入详情页
本回答由Storm代理提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式