Hibernate3延迟加载详解与应用
需积分: 9 86 浏览量
更新于2024-09-11
收藏 32KB DOC 举报
"hibernate延迟加载机制详解及配置方法"
在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,提供了许多优化数据库访问性能的策略,其中之一就是延迟加载(Lazy Loading)。延迟加载是一种设计模式,它允许在真正需要数据时才执行数据加载操作,从而避免不必要的性能开销。在Hibernate 3中,延迟加载主要应用于实体对象、集合以及属性。
1. 实体对象的延迟加载:
要启用实体对象的延迟加载,需要在对应的Hibernate映射文件(.hbm.xml)中对实体类进行配置。例如,对于名为`User`的实体,映射文件中应包含以下配置:
```xml
<hibernate-mapping>
<class name="com.neusoft.entity.User" table="user" lazy="true">
...
</class>
</hibernate-mapping>
```
`lazy="true"`属性表示开启延迟加载。当我们调用`session.load(User.class, "1")`时,Hibernate并不立即查询数据库,而是返回一个代理对象。这个代理对象通常是由CGLIB动态生成的,其内部持有实际实体对象的引用,但属性值都为null。当我们试图访问实体对象的属性(如`user.getName()`)时,CGLIB的回调机制会被触发,这时才会执行SQL查询以获取所需的数据。
2. 集合的延迟加载:
除了实体对象,Hibernate还支持对关联集合的延迟加载。例如,一个`User`实体可能有多个`Address`,默认情况下,这些地址会在加载`User`时一起加载(即时加载)。为了实现延迟加载,我们需要在映射文件中配置`set`或`list`等集合类型:
```xml
<set name="addresses" lazy="true" inverse="true">
<key column="user_id"/>
<one-to-many class="com.neusoft.entity.Address"/>
</set>
```
这里的`lazy="true"`同样用于开启延迟加载。在第一次访问`User`的`addresses`集合时,Hibernate才会执行SQL加载相关的`Address`数据。
3. 属性的延迟加载(Hibernate 3新增):
在Hibernate 3中,还引入了对单个属性的延迟加载。这需要在映射文件中为特定属性添加`<lazy-property>`标签。然而,由于性能和并发问题,这一特性在后续版本中被弃用。
为了正确使用延迟加载,开发者需要注意几个关键点:
- 当使用`Session.load()`时,返回的是一个代理对象,而不是实际的数据。若直接访问该对象的属性,会导致懒加载发生。
- 如果使用`Session.get()`,则会立即加载实体,不涉及延迟加载。
- 在事务范围内,延迟加载可以正常工作。一旦事务结束,`Session`关闭,尝试访问延迟加载的属性将抛出异常。
- 使用`Session.evict()`可以将对象从缓存中移除,这时即使对象是懒加载的,也无法再次加载。
- 注意防止“懒加载地狱”(LazyInitializationException),即在事务外尝试访问延迟加载的属性。为避免这种情况,可以考虑使用开放事务的长会话或者采用Eager Fetching策略。
理解并合理运用延迟加载,可以显著提升应用的性能,减少不必要的数据库交互。但在设计时也要考虑实际需求,避免过度依赖延迟加载,以免引发其他问题。
2010-01-08 上传
2014-03-20 上传
2013-03-19 上传
2012-10-07 上传
2012-01-31 上传
2020-09-06 上传
2020-09-02 上传
2022-06-19 上传
u010845317
- 粉丝: 0
- 资源: 9
最新资源
- BottleJS快速入门:演示JavaScript依赖注入优势
- vConsole插件使用教程:输出与复制日志文件
- Node.js v12.7.0版本发布 - 适合高性能Web服务器与网络应用
- Android中实现图片的双指和双击缩放功能
- Anum Pinki英语至乌尔都语开源词典:23000词汇会话
- 三菱电机SLIMDIP智能功率模块在变频洗衣机的应用分析
- 用JavaScript实现的剪刀石头布游戏指南
- Node.js v12.22.1版发布 - 跨平台JavaScript环境新选择
- Infix修复发布:探索新的中缀处理方式
- 罕见疾病酶替代疗法药物非临床研究指导原则报告
- Node.js v10.20.0 版本发布,性能卓越的服务器端JavaScript
- hap-java-client:Java实现的HAP客户端库解析
- Shreyas Satish的GitHub博客自动化静态站点技术解析
- vtomole个人博客网站建设与维护经验分享
- MEAN.JS全栈解决方案:打造MongoDB、Express、AngularJS和Node.js应用
- 东南大学网络空间安全学院复试代码解析