Hibernate延迟加载理解

Hibernate是什么?
Hibernate和MyBatis一样,是对数据进行持久化的持久层框架,(对于持久化,我们可以简单理解为将存储在内存中的临时性数据搬运到数据库或者文件当中去,即保存到硬盘中进行永久性存储。)Hibernate是一个开源的orm框架,对jdbc进行了简单的封装。
为了优化性能,Hibernate提供了以下几种策略:
1.制定合理的缓存策略
2.采用合理的session管理机制
3.尽量使用延迟加载特性
4.设定合理的批处理参数
5.如果可以,选用UUID作为主键生成器。
6. 如果可以,选用基于版本号的乐观锁替代悲观锁。
7.在开发过程中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的状况;开发完成后关闭此选项。
8.考虑数据库本身的优化,合理的索引、恰当的数据分区策略等都会对持久层的性能带来可观的提升,但这些需要专业的DBA(数据库管理员)提供支持。
——摘自牛客网https://www.nowcoder.com/tutorial/94/1f2614a674cf4854b01166df67fd7366

延迟加载机制:
延迟加载(load)的思想是只有真正使用该对象的数据时才会创建。
**延迟加载的过程:**通过代理机制(Proxy)来实现延迟加载。Hibernate从数据库中获取对象数据、对象的属性集合值或者一个对象所关联的另个一个对象时,由于还没有使用这些数据,Hibernate并不会加载到内存中,而是创建代理对象来替代真实对象,对象上所有的值都为默认值,只有真正需要该数据的时候才会加载。
当调用Session上的load()方法加载实体时,会对这个实体中的集合属性值采用延迟加载;当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载。

关闭延迟加载:在加载单个实体时,可以使用get()方法。

对于实体中的集合属性,可以在这个集合的(,,…)添加属性lazy=“false”。单端关联另一个实体对象时,可以在映射文件中配置, 添加属性lazy="false"注意:one-to-one不能有constrained=true(产生的sql语句中显示外键),否则懒加载不起作用。

2. Hibernate中默认采用延迟加载的情况主要有以下几种:
• 当调用Session上的load()方法加载一个实体时会采用延迟加载。
• 当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。(one-to-many)
• 当Session加载某个实体时,会对这个实体所单端关联(one-to-one, many-to-one)的另一个实体对象采用延迟加载。
• 第二种和第三种的区别是:第二种情况下取消延时加载的方法是在单方即有set属性的一方的映射文件的set标签后设置懒加载的属性lazy=“false”;第三种情况则是在多方即有many-to-one的一方的映射文件中的many-to-one标签后设置lazy=“false”。

能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。

摘抄自:https://www.jb51.net/article/81448.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值