1. 即时加载(Immediate Loading)
当实体加载完成后,立即加载其相关数据。
我们在配置文件XX.hbm.xml 中设置为lazy=false;即这就可以作为即时加载。
2. 延迟加载(Lazy Loading)
实体加载时,其关联数据并非即刻获取,而是当关联数据第一次被访问时在进行读取;也就是在需要数据的时候,才真正执行数据的加载操作。这种加载方式在第一次访问关联数据时,必须在同一个session中,否则会报session已关闭错误。
在hibernate2中的延迟加载实现主要针对:实体对象和集合(collection).
在hibernate3同时提供了属性的延迟加载功能。
我们在配置文件XX.hbm.xml 中设置为lazy=true;即这就可以作为延迟加载。主要用于one-to-many场合.
3. 预先加载(Eager Loding)
预先加载时,实体及其关联对象同时读取,这与即时加载类似,不过实体及其关联数据是通过一条sql 语句(基于外连接[out join] )同时读取。
预先加载即通过out-join完成并联数据的加载,这样,通过一条sql语句即时可完成实体即器并联数据读取的操作,相对即时读取的两条甚至若干条sql而言,无疑这种机制在性能上带来了更多的提升。
不过,对于集合类型(也就是一对多,多对一,多对多关系中),我们并不推荐采用预先 加载方式,理由与即时加载一样,对于集合,只要条件允许,我们应该尽量采用延迟加载方式,以避免性能上可能的无所谓的开销。
注意:当实体间关联比较复杂时,比如多层关联,Hibernate生成的"outer join SQL"可能过于复杂,此时可以通过设定全局变量(hibernate.max_fetch_depth)限定join的层次(一般设定为5层)。
4. 批量加载(Batch Loding)
对于即时加载和延时加载,可以采用批量加载方式进行性能上的优化。
批量加载,简而言之,就是通过批量提交多个限制的条件,一次完成多个数据的读取。
例如:
Select from User where id=1;
Select from User where id=2;
我们可以将其整合一条sql语句完成同样的功能。
Select from User where id=1 or id=2;
这就是所谓的批量加载机制。如果使用了批量加载机制。Heibernate在进行数据查询操作前,会自动在当前session中寻找是否还有其他同类行待加载的数据,如果有,则将其查询条件合并在当前select 语句中一并提交,这样通过一次数据库操作即完成了多个读取任务。
在实体配置的class 节点中,我们可以通过batch-size参数打开批量加载机制,并限定每次批量加载的数量:
<class name=”User” table=”T_User” batch-size=”5”>
一般来说,batch-size应该设置为一个合理的小型数值(<10比较合理).
分享到:
相关推荐
**标题:“Hibernate之数据加载方式”** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它简化了数据库操作,提供了对象关系映射(ORM)的功能。本篇将深入探讨Hibernate的数据加载方式,帮助开发者更好地...
1. **修改Fetch策略**:将Fetch策略设置为`fetch="join"`,即在查询主对象的同时通过JOIN查询的方式加载关联对象,这样就不会抛出延迟加载异常。 2. **禁用延迟加载**:将`lazy="false"`,这样就会在查询主对象时...
这种方式避免了在程序启动或对象创建初期就加载大量不必要的数据,从而降低了内存占用和提高了应用程序的启动速度。 ##### 2.2 Hibernate中的延迟加载实现原理 在Hibernate中,延迟加载是通过代理模式实现的。当...
本篇文章将探讨Hibernate的加载方式以及多态加载的概念。 首先,我们关注Session中的`load`和`get`方法。`load`方法是用于根据主键加载对象,它支持CGLIB懒加载(lazy loading)动态代理。当lazy属性设置为true时,...
### Hibernate延迟加载详解 #### 一、什么是延迟加载? 延迟加载是一种优化技术,在软件开发中广泛应用于各种场景,尤其在...通过合理配置和使用这一机制,可以有效地优化应用程序的数据加载流程,提高用户体验。
为了避免这种情况,Hibernate提供了延迟加载机制,使得只有在真正需要访问`addresses`时,才会去数据库查询相关的`Address`数据。 配置延迟加载的关键在于Hibernate的映射文件。在`<set>`元素中,我们通常会设置`...
综上所述,Hibernate的懒加载策略是通过代理对象和回调机制实现的,旨在按需加载数据,减少不必要的数据库操作,提高系统效率。合理使用懒加载,可以显著优化数据访问性能,但同时也需要考虑其可能带来的问题和挑战...
6. **使用Spring Data的`@EntityGraph`**:允许你在查询时定义数据加载的图形,更精细地控制加载行为。 7. **使用`@Transactional(readOnly = true)`**:对于只读操作,可以使用只读事务,这样即使在Session关闭后...
- Hibernate 自动为懒加载属性创建代理类,这些代理类在需要时才加载真实数据。 #### 四、总结 在 Hibernate 中,延迟加载技术是非常关键的一部分,它能够显著提高应用程序的性能。通过合理地选择 Fetching 策略...
《Hibernate数据持久层jar包源码解析》 在软件开发中,数据持久层是系统架构中的关键部分,它负责将应用程序的数据与数据库进行交互。Hibernate作为一款强大的Java对象关系映射(ORM)框架,极大地简化了这个过程。...
此外,理解Hibernate的“fetch plan”也很重要,这是控制加载关联对象策略的一种方式。FetchType.LAZY和FetchType.EAGER是两种主要的加载策略,前者对应懒加载,后者则是在加载主对象时同时加载关联对象。 总之,...
2. **内存优化**:避免了不必要的数据加载,节省了内存资源,防止内存溢出。 **立即加载与延迟加载的对比** - **立即加载(Eager Loading)**:使用`Session.get()`方法获取对象时,会同时加载与其关联的对象,...
- **数据加载**:首次访问代理类的非ID属性时,Hibernate会执行相应的SQL查询,从数据库中加载数据,并将代理类实例初始化为实际对象。 **5. 示例分析** 以下代码展示了延迟加载的过程: ```java tx = session....
在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...
在这个场景中,"Hibernate加载数据库驱动的Jar"是指在 Hibernate 应用程序中添加 SQL Server 驱动的 JAR 文件,以便正确地连接到SQL Server数据库。 首先,我们来看一下给定的三个JAR文件: 1. **msbase.jar**:这...
这样,Hibernate可以在集合尚未被访问时,避免执行关联的数据加载。 启用集合类型的延迟加载,同样在映射配置文件中进行设置: ```xml <hibernate-mapping> ... </hibernate-mapping> ``` 考虑以下...
如果目标对象(即真实的User对象)尚未加载,Hibernate会执行SQL查询(如`select * from user where id='1'`),获取数据并构建目标对象,然后将其赋值给代理对象的`CGLIB$CALLBACK_0.target`属性。 二、集合类型的...
**延迟加载**(Lazy Loading)是Hibernate框架中的一个重要特性,主要用于优化数据库操作,减少不必要的数据加载,从而提升应用程序的性能。在传统的Eager Loading(急切加载)模式下,一旦加载了一个对象,与之相关的...