问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

hibernate的session不手动关闭会不会自动关闭

发布网友 发布时间:2022-04-11 23:46

我来回答

3个回答

懂视网 时间:2022-04-12 04:08

Session Session是Hibernate向应用程序提供操作数据的主要接口, 他提供了保存、更新、删除、加载Java对象的方法。 Session的缓存 Session有一个缓存,用来缓存Java对象。一般的数据库操作,都要从先从Session的缓存中获取,如果缓存中获取不到,hibernate才

Session

Session是Hibernate向应用程序提供操作数据的主要接口, 他提供了保存、更新、删除、加载Java对象的方法。

Session的缓存

Session有一个缓存,用来缓存Java对象。一般的数据库操作,都要从先从Session的缓存中获取,如果缓存中获取不到,hibernate才会去数据库中获取。

缓存的作用

缓存的作用不言而喻。1、减少数据访问的频率。2、保持保证数据相关记录与缓存中的同步。

清理缓存

Session的save、update、delete方法,只有在清理缓存的时候才向数据库中执行一条Sql语句。所以,Session清理缓存的时间点,是个关键概念。

Session会在一下几个时间点清理缓存,并执行相关语句:

a、当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
b、当应用程序通过Hibernate的Query查询接口等执行查询操作时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。

c、当应用程序显式调用Session的flush()方法的时候。

Java对象在Hibernate中的状态

介绍缓存的方法之前,先介绍一下java对象在缓存中的几种状态,以便更好的立即缓存对对象的操作。

临时状态:通过new方法新创建的对象,还没有持久化到数据库中,也不在Session的缓存中, 此时的对象处于临时状态。对象也成为临时对象。

持久化状态:对象被持久化,同时已经加入到缓存中。此时的对象也被称为持久化对象。

删除状态:对象不在Session缓存中,Session也计划将其从数据库中删除。此时的对象也被称为删除对象。

游离状态:已经被持久化,但没有加载到Session缓存中,称为游离状态,此时的对象也被称为游离对象。

Session接口中的方法

1、save()和persist()

save方法将一个临时对象变为一个持久化对象。并为对象生成OID主键。同时,执行一条insert语句就,将对象存储在数据库中。(save并不立即执行Sql insert语句,而是在Session清理缓存的时候才执行)

save和persist都是将java对象持久化到数据库中的方法。他们的区别在于,persist方法不保证立即为持久化对象生成OID主键,而是在Session清理缓存的时候才为OID生成。

2、get()和load()

get()和load()都是根据OID从数据库中获取一个Java对象。

区别:a、数据库中没有OID对应的对象时,get返回null,load抛出ObjectNotFoundException。b、load默认使用“延迟检索策略”,而get使用“立即加载策略”。关于这两个策略的介绍请看《Hibernate的检索策略》

3、update()

update方法更新java对象的某些属性,并能够使一个游离对象转变为一个持久化对象。同样,update也不是立即执行,也是在清理缓存的时候执行,并且在执行前才组装update语句, 也就是说,它只会组装最后一次设置的对象的属性值。

4、saveOrUpdate()

saveOrUpdate方法,兼有save和update的功能,它会判断传入的对象状态,如果是临时对象, 就执行save;如果是游离对象,就执行update。判断方法有:OID是否为null、

是否具有version版本控制属性并为null,id和version的unsaved-value属性是否与对应的值相等、是否设置了拦截器逻辑的isUnsaved返回true。

5、delete()

delete方法可以删除持久化对象,也可以删除游离对象。它先将游离对象与session相关联,然后准备一条sql语句,然后对象从session中删除,最后等待Session在清理缓存的时候才执行sql语句。

6 、flush()

flush会使Session立即清理缓存,并指向相关数据库Sql语句,但不会提交事务。

7、commit()

commit方法会调用flush清理缓存,执行Sql,并并提交事务。

8、merge()

处于游离状态的对象是不能够执行update语句的,否则hibernate会抛出NotUniqueObjectException异常,如何能够将游离状态的对象在恢复到持久化状态呢。使用merge方法就可以办到。merge方法能够将一个游离对象的属性复制到持久化对象中。

下面是对象的状态转换图(来自网络),从这个图中我们可以看到状态转换和Session中方法的调用关系。

热心网友 时间:2022-04-12 01:16

准确的讲应该是:hibernate的session在和数据库打完交道后有的会自动关闭,有的不会自动关闭,但为了避免混乱,你编码的时候必须手动关闭,也可以写一个过滤器之内的东东,把没有关闭的Session关闭掉,那样在编码的时候就没有必要考虑要不要关闭它了,以免遗忘

热心网友 时间:2022-04-12 02:34

采用getcurrentsession()创建的session在commit或rollback时会自动关闭,而采用opensession(),创建的session必须手动关闭
.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 hibernate为什么要有session 在hibernate中,session的作用是什么,怎么用呢,谢谢各位大虾了。 hibernate中的session指的是什么 hibernate中的session指的是什么?可否将单个的session在多个线程间进行共享 Hibernate中Session什么意思? sap hana 收费吗 《saphana实战》pdf下载在线阅读全文,求百度网盘云资源 hana的应用软件 sap hana 为什么抛弃oracle sap hana插上32路cpu,性能有多大飞跃 SAP HANA插上32路CPU,性能多大飞跃 各位SAP HANA是什么意思 sap hana是属于哪一种数据库技术方案 公司原来上的SAP ERP,最近又要引入HANA,有谁对SAP HANA比较了解,能否介绍一下? 64g的数据库sga是多大 如何估算PGA,SGA的大小,配置数据库服务器的内存 为什么我的电脑连不上网络了,提示拒绝远程连接,因为未识别出您提供的用户名和密码组合 什么时候使用CountDownLatch 时钟脉冲有效电平即将到达下降沿的最后的状态为实际状态? latch up test 是什么意思 hibernate session 什么时候关闭 hibernate怎么判断session是否关闭 Hibernate中的session和httpsession什么区别?? hibernate中session与JSP中session的区别是什么? Hibernate的Session hibernate session的问题 Hibernate中的session.clear(),save(),和flush()的理解? Hibernate的Session的lock方法和merge方法有什么区别 java hibernate 注解 怎么获取session 如何查看hibernate session是否关闭 hiredis 怎么创建多个数据库 hiredis支持lua调用吗 hiredis 能用在3.0版本 redis集群吗 windows hiredis能访问linux的redis吗 关系型数据库中存储过程的用户接口有哪些 我国企业供应链管理信息系统的现状 想兼职做一些企业报表, 数据库开发, 企业ERP接口扩展方面的工作, 好找吗? +什么是反向键索引+反向键索引原理+创建反向键索引 如何建立高效的反向索引 在什么样的环境下需要建立反向键索引