`

hibernate的优化-懒加载(lazy)

 
阅读更多

为了进一步优化Hibernate的性能,可以使用:

延迟加载技术、管理数据抓取策略、进行缓存管理 等方面考虑来提高Hibernate的性能。

 

1. 延迟加载(load)

延迟加载(load)是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建

延迟加载的过程通过代理(Proxy)机制来实现延迟加载。Hibernate从数据库获取某一个对象数据时、获取某一个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据(除标识符外),Hibernate并不从数据库加载真正的数据,而只是为该对象创建一个代理对象来代表这个对象,这个对象上的所有属性都为默认值;只有在真正需要使用该对象的数据时才创建这个真正的对象,真正从数据库中加载它的数据。

当调用Session上的load()方法加载一个实体时;当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载;当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载

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

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

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关闭后,再访问懒加载的对象将出现异常。

 

3. 抓取策略(fetch)

通过配置“抓取策略”来直接影响session的get()和load()方法的查询效果。

单端关联<many-to-one><one-to_one>上的抓取策略:

可以给单端关联的映射元素添加fetch属性。select:延迟加载; join:在同一条select语句使用内连接来获得对象的数据和它关联对象的数据,此时关联对象的延迟加载失效。

集合属性上的抓取策略:

select:延迟加载;join:在同一条select语句使用内连接来获得对方的关联集合。此时关联集合上的lazy会失效。subselect:另外发送一条查询语句或子查询抓取。这个策略对HQL的查询也起作用。

 

4. 延迟加载案例分析

情况一:单个实体调用load()方法取消懒加载

 

package com.hbsi.test;

import org.hibernate.Session;

import org.junit.Test;


import com.hbsi.domain.User;

import com.hbsi.utils.HibernateUtil;


publicclass TestLazy {


//测试get()方法;get()方法不管你有没有用到,总会执行sql语句

@Test

publicvoid testGet(){


Session session = HibernateUtil.getSession();

User user = (User) session.get(User.class,1);

// System.out.println(user.getName());

HibernateUtil.close();

//这里要注意的是:即使关闭了session,使user处于托管状态,仍然可以可以使用user对象;这是因为虽然处于托管状态,但是这个对象是存在属性值的对象,并没有把他删除,只是隔绝了它与数据库的打交道的通道。

System.out.println(user.getName());

}

//测试load()方法;不执行sql语句,用到的时候才执行

@Test

publicvoid testLoad(){


Session session = HibernateUtil.getSession();

User user = (User) session.load(User.class,1);

//这里输出id也不会执行sql语句,直接从上面你传进去的id中获取id,没有从数据库中查找,所以也不执行sql语句

System.out.println(user.getId());

//而输出name就不一样了,这时其实就是实例化了代理对象,这是的代理对象有了name的属性,这时即使你关闭了session,也可以通过这个对象获取到name;如果注释这句,即不实例化代理对象,又在关闭session后执行输出name属性,这时会报错:could not initialize proxy

// System.out.println(user.getName());

HibernateUtil.close();

System.out.println(user.getName());

}


}

 情况二:set集合上取消懒加载

//测试如果在映射文件中将集合属性中的懒加载设置为false后将连带着orders表中数据一块提出来,即两条select语句

@Test

publicvoid find(){


Session session = HibernateUtil.getSession();

Customer cus = (Customer) session.get(Customer.class,3);

System.out.println(cus.getCname());


//用到下面这种方法输出会出现两天sql语句,而且是分开的;如果用到懒加载会出现先输出两条sql语句,在输出结果

//这里不能直接方法链式输出cus.getOrd().getOname();因为cus.getOrd()返回的是一个set集合

Set<Orders> orders = cus.getOrd();

System.err.println(orders.size());


HibernateUtil.close(); 

}

 

分享到:
评论

相关推荐

    SpringBoot-SpringData-懒加载

    session in view**:在Spring Boot中,如果使用Hibernate作为JPA的实现,需要在配置文件(application.properties或application.yml)中开启Open Session In View(OSIV)过滤器,以解决懒加载在HTTP请求结束后引发...

    hibernate懒加载策略.doc

    在Java持久化框架Hibernate中,懒加载(Lazy Loading)是一种优化策略,用于提高应用程序的性能和效率。懒加载的基本思想是“按需加载”,即在实际需要数据时才进行数据库查询,而不是在对象初始化时一次性加载所有...

    hibernate--- jar包

    8. **性能优化**: Hibernate提供了一些优化手段,如二级缓存、批处理、延迟加载(lazy loading)、预加载(eager loading)等,以提高应用性能。 9. **一对多、多对一、多对多关系映射**: Hibernate可以轻松处理...

    hibernate3-2 官方jar包+api

    8. **懒加载(Lazy Loading)**:Hibernate支持延迟加载,即关联的对象或集合不会在实体加载时立即加载,而是在需要时才加载,从而优化了性能。 9. **生命周期管理**:Hibernate自动管理对象的状态(瞬时态、持久态...

    Hibernate one-to-many / many-to-one关系映射

    2. 使用懒加载(lazy="true"):默认情况下,关联数据会随着主对象一起加载,但通常不建议这样,除非确实需要,应使用懒加载以提高性能。 3. 双向关联的管理:确保双向关联的正确维护,避免数据一致性问题。 4. 外键...

    hibernate-release-4.3.10.Final.zip

    - 注意懒加载(Lazy Loading)与级联操作的使用,防止“懒加载地狱”。 总结,`hibernate-release-4.3.10.Final`版本是Hibernate框架的一个重要里程碑,其提供的强大功能和优化特性使得Java开发者在处理数据库操作...

    hibernate在集合上的lazy策略

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种优化策略,它允许我们推迟对关联对象的加载,直到真正需要它们的时候。标题“hibernate在集合上的lazy策略”指的是Hibernate如何处理与实体相关的集合...

    hibernate-orm-3.3源码

    Hibernate 支持懒加载(Lazy Loading),即延迟加载关联对象,直到真正需要时才从数据库加载,有效避免了"数据溢出"问题。它通过生成代理对象实现这一功能。 七、事件监听器 Hibernate 提供了一套事件监听系统,...

    hibernate-release-5.0.7 全包

    Hibernate使用它来实现类的动态代理和字节码增强,例如懒加载(lazy loading)和CGLIB代理。 3. **antlr-2.7.7.jar**:ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。在...

    hibernate源码release-4.1.4.Final版

    Hibernate的懒加载机制可以在需要时才加载关联的对象,避免了大量数据一次性加载导致的内存压力。但需注意防止“懒加载地狱”。 九、性能优化 包括但不限于:合理使用缓存,避免N+1查询问题,使用批处理更新,选择...

    Hibernate lazy延迟加载

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会立即加载其关联的对象或集合,而是在真正需要...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    hibernate5--4.检索方式及策略

    2. **Lazy Loading**: 默认情况下,Hibernate采用懒加载策略,只有在实际访问关联对象时才会发起数据库查询。这有助于提高性能,因为不是所有的关联数据都立即加载。 3. **Eager Loading**: 相反于懒加载,急加载会...

    hibernate-extensions-2.1.3

    1. **延迟加载(Lazy Loading)增强**:Hibernate核心库已经支持延迟加载,但扩展可能提供了更精细的控制,例如按需加载关联的对象集合,减少内存占用和提高性能。 2. **批量操作**:批量插入、更新和删除功能可以...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    hibernate-entitymanager-3.4.0.GA

    8. **懒加载(Lazy Loading)**:一种优化策略,使得关联的对象在需要时才从数据库加载,避免不必要的性能开销。 9. **缓存**:Hibernate支持一级缓存(Session级别的)和二级缓存(SessionFactory级别的),可以...

    hibernate-release-5.2.10

    Hibernate支持懒加载策略,允许关联对象在需要时才加载,避免了不必要的数据库查询,提高了性能。 九、多对一、一对多、多对多关系 Hibernate通过外键映射和集合映射处理这些关系,如@ManyToOne、@OneToMany、@...

    Hibernate one-to-many-annotation

    1. **懒加载**:避免在不需要时加载全部关联数据,以减少数据库交互和提高性能。 2. **批处理**:使用`@BatchSize`注解可以设置一次从数据库获取关联数据的数量,降低数据库访问次数。 3. **子查询优化**:通过子...

    Hibernate lazy加载FOR Connection

    标题中的“Hibernate lazy加载FOR Connection”指的是Hibernate框架中的一种特性,即懒加载(Lazy Loading)。在Hibernate中,懒加载是一种优化策略,它推迟对关联对象的加载,直到真正需要使用这些对象时才进行加载...

    hibernate-distribution-3.6.8.Final-dist

    此外,还增强了对延迟加载(Lazy Loading)的处理,避免了“懒加载地狱”。 2. **API稳定**:这个版本主要关注API的稳定性和兼容性,确保了升级到新版本不会引入重大问题。 3. **错误修复**:在3.6.8.Final版本中...

Global site tag (gtag.js) - Google Analytics