Hibernate相关问题

Hibernate相关问题

Hibernate缓存的种类?

答:分为内置缓存和外置缓存两种.

内置缓存的分类:

1、Session中的内置缓存,这个是Hibernate缓存不可缺的组成部分,将持久化对象缓存到Session中

2、SessionFactory中的内置缓存,这个是Hibernate缓存不可缺的组成部分,将一些数据库操作的

Sql语句缓存起来。这个缓存是只读的

持久化层的缓存的范围:

1、事务范围:Session的内置缓存就是一个事务范围的,也就是缓存的生命周期随着事务的建立而产生,

随着事务的结束而消亡。

2、进程范围:缓存被进程内的所有事务共享,这些事务由可能并发访问缓存,因此必须对进程范围的缓存

提供事务隔离机制。

3、集群范围:缓存被同一个机器或多个机器上的多个进程共享。对于大多数应用要慎重考虑集群范围的缓存

由于并发的原因对应用性能影响较大。一般将只读的数据或者很少修改的数据存储到集群范围的缓存中。

外置缓存的支持:

Hibernate提供了EBCache、OSCache、SwarmCache、JBossCache这些第三方插件的适配器。具体的配置方法

请查看相关的文档。

注意:在对数据进行批量处理的时候为了提高性能还是直接通过Hibernate调用底层的数据库操作API。


1


一、Session在什么情况下清理缓存?

答:

1、当应用程序调用Transaction.Commit()方法的时候,先清理缓存,然后再向数据库提交事务。

2、当应用程序调用Session.Find()或者Iterate()方法时,如果缓存中的持久化对象的属性发

生了变化,就会先清理缓存,以保证查询的结果能反映持久化对象的最新状态。

3、当应用程序显式调用Session.Flush()方法的时候。

注意:Session进行清理缓存的例外情况是,如果对象使用native生成器来生成OID,那么当调用Session的Save()

方法保存该对象时,会立即执行向数据库插入该实体的insert语句


二、Session在清理缓存时,会按照什么顺序来执行Sql语句?

答:

1、按照应用程序调用Session.Save()方法的先后顺序,执行所有对实体进行插入的insert语句。

2、执行所有对实体进行更新的update语句。

3、执行所有对集合进行删除的delete语句。

4、执行所有对集合元素进行更新、删除、插入的sql语句。

5、执行所有对集合进行插入的insert语句。

6、按照应用程序调用Sesson.delete()方法的先后顺序,执行所有对实体进行删除的delete语句。


三、Session清理缓存的三种模式


清理缓存的模式


Session查询方法


Session的Commit方法


Session的Flush方法



FlushMode.Auto

清理

清理

清理


FlushMode.Commit

不清理

清理

清理


FlushMode.None

不清理

不清理

清理



四、Session的SaveOrUpdate方法如何工作,如何判断一个对象是临时对象还是游离对象?

答:如何传入的参数是临时对象就调用Save()方法;如果传入的对象是游离对象,就调用Update()方法;如果传入的参数是持久化对象就直接返回。

Hibernate判断临时对象的标准:

1、 实体对象OID为null

2、 实体对象具有version属性并且取值为null

3、 在映射文件中为<id>元素设置了unsaved-value属性,并且OID取值与unsaved-value属性值匹配。

4、 自定义Hibernate的Interceptor实现类,并且Interceptor的isUnsaved()方法返回Boolean.True。

五、在进行对象级联的时候有一个cascade属性,这个属性的属性值代表什么意义?


cascade属性值


描述



none

在保存、更新或者删除对象时,忽略其他关联的对象,它是级联的默认值


save-update

当通过Session的Save()、Update()以及SaveOrUpdate()方法来保存、更新对象时,级联保存关联的临时对象,并更新关联的游离对象。


delete

当通过Session的Delete()方法删除当前对象时,同时会删除关联的所有对象。


all

包含save-update以及delete的行为,此外对当前对象进行Evict()或者Lock()方法时会对关联的对象进行同样的操作。


delete-orphan

删除所有和当前对象解除关联关系的对象。


all-delete-orphan

包含all和delete-orphan的行为。



六、Hibernate在与触发器协同工作的时候如何保持数据的同步?

答:当Session执行Save()方法、SaveOrUpdate()方法、Update()方法时立即执行Session的Reflush()方法,直接绕过Session缓存从数据库中加载数据,


七、如何改变Hibernate操作持久化对象的行为?

答:通过对拦截器接口的实现改变Session的操作行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值