`
cfeers
  • 浏览: 141449 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hiberante入门(十三):懒加载

阅读更多

4.懒加载:

在前面我们已经对懒加载有所提及,现在再借助一个简单的实例(它们均位于lazyLoad项目下)再来重新认识懒加载:先看下面的代码:

Java代码 复制代码
  1. package com.asm.hibernate.test;   
  2. public class UserTest2 {   
  3.     public static void main(String[] args) {   
  4.         addUser();   
  5.         User u = getUser(1);   
  6.         System.out.println("return type:" + u + "\t name=" + u.getName());   
  7.     }   
  8.   
  9.     static User getUser(int id) {   
  10.         Session s = null;   
  11.         try {   
  12.             s = HibernateUtil.getSession();   
  13.             User user = (User) s.load(User.class, id);   
  14.   
  15.             // 以下的两种方式都可以让懒加载去真正连接数据库。   
  16.             Hibernate.initialize(user);   
  17.             // System.out.println(user.getName());   
  18.   
  19.             System.out.println("load--User:" + user.getClass());   
  20.             return user;   
  21.         } finally {   
  22.             if (s != null)   
  23.                 s.close();   
  24.         }   
  25.     }   
  26.     static void addUser() {   
  27.         省略内容:此方法的作用就是插入一条记录到数据库中,以使我们的查询操作可以进行。   
  28.     }   
  29. }  
package com.asm.hibernate.test;
public class UserTest2 {
	public static void main(String[] args) {
		addUser();
		User u = getUser(1);
		System.out.println("return type:" + u + "\t name=" + u.getName());
	}

	static User getUser(int id) {
		Session s = null;
		try {
			s = HibernateUtil.getSession();
			User user = (User) s.load(User.class, id);

			// 以下的两种方式都可以让懒加载去真正连接数据库。
			Hibernate.initialize(user);
			// System.out.println(user.getName());

			System.out.println("load--User:" + user.getClass());
			return user;
		} finally {
			if (s != null)
				s.close();
		}
	}
	static void addUser() {
		省略内容:此方法的作用就是插入一条记录到数据库中,以使我们的查询操作可以进行。
	}
}

 

执行后,打印结果如下:

load--User:class com.asm.hibernate.domain.User$$EnhancerByCGLIB$$212cbff4

return type:com.asm.hibernate.domain.User@1f6ba0f    name=jack

注意到上面第一行打印结果,可以发现返回的是User的一个子类,借此来看看懒加载的实现,懒加载的意思是只有当我们真正要查询的数据时,它才真正去连接数据库,为什么要提出懒加载呢,我们知道数据库的连接是非常耗资源的,有了懒加载可以从一定程度上降低数据库连接资源的消耗。  懒加载本质是借助asm.jarcglib.jar这两个jar包,来生成User的一个子类,这就是前面提到“使用懒加载时实体类不能是final”的原因,从这里我们知道hibernate用构建实体类的子类来实现一个更强大的操作功能,这样即使数据库无记录,查询返回的结果对象也永远不会为null,即是说“返回的结果对象==null”永远不能成立,但这并不表示一定查询出了结果。其实如果我们以懒加载查询的结果为空,而我们再对这个对象进行操作时,是会报错得。  概述要点:(1hibernate构造了实体类的子类来查询(2)要使用赖加载,实体类不能声明为final (3)查询结果对象永不为空。(4)只要连接未关,如果我们想获知此对象的任何属性信息都会引起懒加载去连接数据库,但是如果我们是企图获取它的id时,却不能让hibernate去连接数据库。

补充说明:其实这种懒加载的使用很少,它通常在需要关联两个实体对象时使用,比如我们希望把查询出的User user对象关联到部门中去时,即我们 Employee emp=new Employee(); emp.setUser(user);在这种情况下我们并不关心它的查询内容,只是想关联到部门中去,所以此时使用懒加载是一个节省“数据库连接资源”的好方法。

5.概述关联关系中的懒加载:

(1)一对一中的懒加载:必需要同时满足三个条件才能实现懒加载:即在<one-to-ont> 元素中配置lazy!=false(即是为trueproxy);constrained=true;fetch=select,但在主表中不会有懒加载,因为主表不能满足constrained=true;其实在主外键关联的“一对一“关联关系中,我们判断主表和从表也是从是否配置“constrained“来判断:因为constrained的配置只会在从表中出现。从上面的分析中可以得知:查询主表永不会使用懒加载,查询从表可选择懒加载。下面再结合fethch来分析查询从对象时的懒加载:

 

 

fetch=join

fetch=select

lazy=true

由于采取的是join连接查询,所以会一次关联所有的表查出所有数据,这样懒加载失效。

懒加载有效,实际查询从对象发展时,才去连接数据库。

lazy=false

false意为不使用懒加载。

lazy=proxy

默认设置:使用代理实现懒加载。

提示:fetch的意思是“通过什么方式抓取”,lazy的意思是“什么时候抓取”。“抓取”

意为“获得数据,连接数据库”。 其实在“一对一”中使用懒加载对性能提升不多大的作用。

分析“查询主对象不能使用懒加”:当我们要想获取一个主对象时,仅从查询主表是不能判断出是否有从对象,比如我们在查询主表获取Person对象时,不能从主表中查出是否有有“身份证号“,这样我们便不能正确设置Person对象的身份证属性,所以hibernate采取了连接查询,这也就是为什么主对象不能使用懒加载的原因。但是查询从对象可使用懒加载,原因如下:当我们通过查询从表获知从对象时,可以在从表的主外键中查询这个身份证号是否有Person对象对应,如果没有,设它的person属性为null,如果有我们放置一个代理,当要真正查询时,便通过这个代理来查询。

2)其它关联关系使用懒加载的条件:在实配置文件中的“关联关系配置配置元素中配置时满足以下两个条件:lazy!=falsefetch=select

3)强调:能够懒加载的对象都是被必定过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性会初始化这些代理(便getIdgetClass除外)对象,当相关的session关闭后,再访问懒加载对象将会出现异常“could not initialize proxy - no Session”。

4)灵活选择:在查询方法是我们有时候希望使用代理懒加载,但有时候我们可能又要具体查询出数据。我们可以这样做来灵活选择:

public Object query(int id,boolean signLazy){

    ....

if(signLady)

    Hibernate.initialize(代理对象);

说明:为true,则会初始化代理,连接数据库,且在此方法调用完成后得到的对象是可以进行有关此对象的属性访问得。为false,则不会去真正连接数据库,只是为了建立起某种关联关系服务

....

}

(5)简单的属性也可以使用懒加载,但效果不大,除非是用在大的文本段。

分享到:
评论

相关推荐

    hiberante入门(十七):简要总结及源码文档

    NULL 博文链接:https://86asm.iteye.com/blog/493165

    Hiberante part 9:一对一关系映射

    3. **Fetch策略**:默认情况下,一对一关系的Fetch策略为`EAGER`,即加载主实体时会同时加载关联的实体。如果不需要立即加载,可以设置为`LAZY`,延迟加载关联实体。 4. **级联操作**:通过`CascadeType`可以设置...

    Hiberante3相关文档

    “Hibernate3_数据加载”则可能涵盖Hibernate的数据检索策略,如懒加载、立即加载、批量加载等,这些都是优化数据访问效率的关键。 **详细知识点** 1. **Hibernate3_HQL**: Hibernate Query Language(HQL)是...

    hiberante3 注解帮助文档

    hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档hiberante3 注解帮助文档

    hiberante 源码 配置资料

    4. 缓存配置:Hibernate提供了一级缓存和二级缓存,一级缓存是Session级别的,而二级缓存可以通过第三方插件如Ehcache进行配置,提高数据访问性能。 5. SessionFactory初始化:通过`Configuration`类加载配置信息并...

    DAO层中对Hiberante

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者将数据库操作转化为对Java对象的操作。DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问...

    最新springboot2hiberante5项目

    最新springboot2基础hiberante5完整项目,打包jar,运行jsp,包括后台与前台,拦截器,登录,后台下载就可以使用,注意不是jpa,里面有完整Dao,千万级数据项目分离的代码,为了适合老项目开发特意集成hiberante5....

    Struts2+Hiberante+ajax+Mysql 三级联动

    总的来说,"Struts2+Hiberante+ajax+Mysql 三级联动"项目展示了如何利用这些技术进行高效的Web开发,特别是在处理多级交互和动态数据展示方面。通过学习和实践这样的项目,开发者可以提升对Java Web开发的理解,尤其...

    Struts+Hiberante+Sprint 框架整合

    开发工具:MyEclipse 6....Struts+Spring+Hiberante框架整合的简单登录系统 无需配置任何文件、只需在mysql中创建一个空数据库 如:create database test; 注:mysql数据库用户名:root 密码:root

    spring+mvc+hiberante

    Spring 框架是 Java 企业级应用开发中的核心组件,它提供了全面的软件基础设施,包括依赖注入(DI)、面向切面编程(AOP)以及众多的模块如数据访问、Web 应用、任务调度等。Spring MVC 是 Spring 框架的一部分,...

    Hiberante 有关jar包

    Hibernate Tools是一套全新而且完整的面向Hibernate3的工具集合,它包含了Eclipse插件和Ant编译流程。Hibernate Tools是JBoss Tools的核心组件,所以他也是JBoss Developer Studio的一部分

    Hiberante3.jar + API

    Hibernate3.jar是Hibernate ORM框架的第三个主要版本,它提供了丰富的功能,包括对象持久化、查询语言(HQL)、事务管理和缓存机制等。这个JAR文件包含了所有必要的类和库,使得开发者可以直接在项目中引用,实现对...

    hiberante5.0.7安装jar包

    **三、配置文件** 主要的配置文件是`hibernate.cfg.xml`,其中包含了数据库连接信息、缓存设置、实体类扫描路径等关键配置。例如: ```xml &lt;property name="hibernate.connection.driver_class"&gt;...

    hiberante中文帮助文档

    10. **懒加载和立即加载**:Hibernate提供了懒加载机制,允许在需要时才加载关联的对象,以避免不必要的性能开销。而立即加载则是在获取主对象时,同时加载其关联的对象。 这份文档深入浅出地讲解了这些核心概念,...

    springmvc hiberante

    开发者需要创建资源文件,比如messages.properties(英文)和messages_zh_CN.properties(中文),并配置MessageSource来加载这些文件,以便在应用中根据不同地区显示相应的消息。 3. 拦截器:Spring MVC的...

    Hiberante中的五大核心接口.txt

    - **读取配置**:`Configuration` 类可以加载并解析配置文件,从而获取数据库连接的信息、缓存策略以及其他配置参数。 - **构建SessionFactory**:通过调用 `Configuration` 的 `buildSessionFactory()` 方法来创建 ...

    hiberante4.2.3-part2

    hiberante4.2.3-part2

    hiberante4.2.3-part01

    6. **延迟加载**:Hibernate的懒加载机制(lazy loading)允许我们在需要时才加载关联的对象,这有助于减少内存消耗和提高程序性能。 7. **事务管理**:Hibernate提供了对JTA(Java Transaction API)和JDBC事务的...

    hiberante查询方式使用详解

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。本文将深入探讨Hibernate的四种主要查询方式:HQL(Hibernate Query...

    hiberante-4.2.3-part3

    hiberante-4.2.3-part3

Global site tag (gtag.js) - Google Analytics