在传统的JDBC操作里,通常通过sql语句查询加载所需要的数据,当sql提交之后,这些数据也就被读取待用了,而在hibernate里,我们拥有了更多的数据加载的方式。以实现不同种的需求。
hibernate支持以下四种数据加载方式:
1、及时加载(Immediate Loading)--实体加载后,立即加载其关联数据。
2、延迟加载(Lazy Loading)--实体加载后,关联数据第一次被需要时,即访问然后加载。
3、预先加载(Eager Loading)--预先加载时,实体及其关联同时读取,于及时加载类似,但是通过一条sql(基于外连接查询)
4、批量加载(Batch Loading)--相对于及时和延迟加载,采用批量方式,可以进行性能上的优化。
一、及时加载
还是引入上篇中的User表和Address表,即一个用户可有多个住址。其配置中部分关联关系如下:
<set
name="address"
table="Address"
inverse="true"
cascade="none"
sort="unsorted"
lazy="false"
>
<key column="user_id"/>
<one-to-many class="com.entity.Address"/>
</set>
此时,再去做一个查询,代码如下:
String hql="from User where name='Erica' ";
List list=session.createQuery(hql).list();
syso("query finished");
Iterator it=list.iterator();
while(it.hasNext()){
User uesr=(User)it.next();
syso(user.getName());
syso(user.getAddresses().size());
}
在设置过show_sql后,控制台打印如下信息:
Hibernate:select......from User user where (name='Erica')
Hibernate:select......from Address addr where addr.user_id=?
query finished
Erica
2
从中我们可以得出,在执行find的时候,hibernate链接调用了2条sql语句,分别完成了对User和Address对象的加载。这就是及时加载的原理,当关联主体加载时(此处则我们的User对象),hibernate会立即自动读取其关联数据并完成关联属性的填充。
二、延时加载
延时加载就是对应上面及时加载所产生的,当我们不需要关联表的数据的时候,我们不需要查询,需要的时候,再发送语句,这样就避免了过多的性能的消耗。
将上面的部分配置的lazy属性改掉(hibernate3中,lazy属性默认为true,即默认启用延迟加载),即代码如下:
<set
name="address"
table="Address"
inverse="true"
cascade="none"
sort="unsorted"
lazy="true"
>
<key column="user_id"/>
<one-to-many class="com.entity.Address"/>
</set>
再次运行查询代码,我们发现控制台打印了如下的show_sql信息:
hibernate:select .....from User user where (name='Erica' )
query finished
Erica
hibernate:select ..... from Address addr where addr.user_id=?
2
与上面的不同的是,当代码运行到syso(user.getName());时,hibernate只有一条语句,而然在打印地址的个数的时候,激发了第二天sql语句去查询size()的大小。这就是他的特点,当真正需要关联表的数据的时候才会去做读取操作,从而提高性能。
三、预先加载
预先加载是通过outer join完成关联数据的加载,也是通过一条sql语句完成对实体以及其关联数据的读取操作,相对应即时加载的两条或多条,无疑提高了性能,但是一般只适用于一对一的关系。对于大部分的集合类型,还是推荐使用延迟加载的模式。一般而言,outer join可以提高处理的效率,但是对于关联关系复杂的,如多层关联,hibernate会生成非常复杂的sql语句,此时,我们应该根据实际情况,判断它的实用性,同时,也可以通过设置全局变量(hibernate.max_fetch_depth)限定outer-join的关联层次,一般5层比较合适。
四、批量加载
顾名思义,就是通过批量提交多个限定条件,一次完成多个数据读取,如对于下面的sql请求:select from User where id=1; select from User where id=2经过整合后变为,select from User where id=1 or id=2。如果使用了这种方式,hibernate在进行数据操作前,会自动在当前session中寻找,是否有其他同类型的待加载的数据,如果有,则将其合并在当前的select 语句中一起提交。
在实体的配置中,我们可以在class节点下,通过设置batch-size打开批量加载机制,并限定每次批量加载的数量,代码如下:
<class name="User" table="Uesr" batch-size="5">
分享到:
相关推荐
**标题:“Hibernate之数据加载方式”** 在Java的持久化框架中,Hibernate是一个非常重要的工具,它简化了数据库操作,提供了对象关系映射(ORM)的功能。本篇将深入探讨Hibernate的数据加载方式,帮助开发者更好地...
在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...
本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 ...
### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...
在处理大数据量或者复杂数据结构时,Hibernate引入了延时加载(Lazy Loading)机制,以提高应用程序的性能。本文将深入探讨在JSP(JavaServer Pages)环境中,如何理解和应对Hibernate的延时加载问题。 首先,我们...
当Hibernate加载一个实体时,默认不会立即加载其关联的实体或集合属性。相反,它会创建一个代理对象来表示这些属性。当程序试图访问这些属性时,Hibernate会在后台异步加载实际的数据。 #### 三、延迟加载的具体...
延迟加载是指Hibernate在初始加载实体时并不立即获取所有关联的数据,而是等到实际需要这些数据时才执行相应的SQL查询。这有助于避免一次性加载大量数据导致的性能问题和内存消耗。 **2. 懒加载机制(Lazy ...
本篇文章将探讨Hibernate的加载方式以及多态加载的概念。 首先,我们关注Session中的`load`和`get`方法。`load`方法是用于根据主键加载对象,它支持CGLIB懒加载(lazy loading)动态代理。当lazy属性设置为true时,...
如果代理对象的`target`属性为空,那么Hibernate会发出SQL查询以加载实际的数据并创建真实的User对象,然后将其赋值给代理对象的`target`属性。之后所有的访问都会直接作用于真实对象。 ##### 2. 集合类型的延迟...
为了避免这种情况,Hibernate提供了延迟加载机制,使得只有在真正需要访问`addresses`时,才会去数据库查询相关的`Address`数据。 配置延迟加载的关键在于Hibernate的映射文件。在`<set>`元素中,我们通常会设置`...
在Hibernate中,最直观的批量更新方式是通过循环遍历查询结果集,并对每个实体进行更新,然后提交事务。例如: ```java Transaction tx = session.beginTransaction(); Iterator<Customer> customers = session....
在Hibernate应用中处理批量更新和批量删除时,开发者应充分考虑数据库性能和资源消耗,合理利用Hibernate提供的高级功能和JDBC API,以及数据库自身的特性,以实现高效、稳定的批量数据处理。通过上述策略的应用,...
hibernate3的属性延时加载是个很有意义的东西,它能让你把你不想加载到内存里的东西在查询的时候排除。 我相信来下载这个东西的人都已经很了解这一块的知识了,只是配不对那个类增强器才来下载我这个文件。 这些...
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
Hibernate本身提供了一种批量删除的方式,但由于它是逐条执行删除操作的,因此当数据量较大时,效率会受到影响。为了解决这一问题,Hibernate提供了对JDBC的支持,使得开发者能够利用JDBC的批量处理能力来优化批量...
- Hibernate 自动为懒加载属性创建代理类,这些代理类在需要时才加载真实数据。 #### 四、总结 在 Hibernate 中,延迟加载技术是非常关键的一部分,它能够显著提高应用程序的性能。通过合理地选择 Fetching 策略...
综上所述,Hibernate的懒加载策略是通过代理对象和回调机制实现的,旨在按需加载数据,减少不必要的数据库操作,提高系统效率。合理使用懒加载,可以显著优化数据访问性能,但同时也需要考虑其可能带来的问题和挑战...
在Java的Web开发中,Spring框架与Hibernate的整合是常见的数据访问层实现方式。Spring提供了强大的依赖注入(DI)和AOP(面向切面编程)功能,而Hibernate则是一个优秀的对象关系映射(ORM)框架,它使得Java开发者...