hibernate的session

本文深入探讨了Hibernate Session的概念及其缓存机制,解释了Java对象在缓存中的几种状态,包括临时状态、持久化状态、删除状态和游离状态,并详细介绍了Session接口中的关键方法如save、update、flush和commit等,以及它们如何影响对象状态和数据库操作。
摘要由CSDN通过智能技术生成

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、当应用程序显式调用Sessionflush()方法的时候。


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中方法的调用关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值