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

hibernate学习之第十三篇

阅读更多

load方法的懒加载及原理分析

懒加载的目的,减少不必要的数据库查询,提升性能。

借用前面组件映射中的user类,对测试代码做写改变:

public class Main {

    public static void main(String[] args) {
        User user = new User();
        user.setBirthday(new Date());

        saveUser(user);
        User u = query(1);
        u.getUserName();
    }

    public static void saveUser(User user) {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        Name name = new Name();
        name.setFirstName("firstName");
        name.setLastName("lastName");
        user.setUserName(name);
        session.save(user);
        tx.commit();
        session.close();
    }

    static User query(int id) {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        User user = (User) session.load(User.class, 1);
        System.out.println(user.getClass());
        tx.commit();
        session.close();
        return user;
    }
}
 

执行以上代码:出现异常。Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
这是初始化代理错误。原因是session被关闭了。session.close()注释掉,就不会出现异常。
输出的sql语句为:
Hibernate: insert into `user` (first_name, last_name, birthday, id) values (?, ?, ?, ?)
class hibernatetest.User$$EnhancerByCGLIB$$f2a06d41
Hibernate: select user0_.id as id0_0_, user0_.first_name as first2_0_0_, user0_.last_name as last3_0_0_, user0_.birthday as birthday0_0_ from `user` user0_ where user0_.id=?

那么这里为什么会用到代理呢?
hibernate为了实现懒加载机制,调用load方法时,返回的实际上是User的代理类hibernatetest.User$$EnhancerByCGLIB$$f2a06d41的实例。该代理类功能比较强大,能够实现懒加载。该类继承了User,所以在程序代码中做类型转换才不会出现问题( User user = (User) session.load(User.class, 1);),类的上溯造型没有问题哈。该代理类实例中并没有什么已知的数据,只有当你实际要获取时,代理才会到数据库中去取相应的数据。这也说明了前面中,建议类不要定义成final的,一旦定义成final的,那么hibernate就不能生成代理类了。

代理与session是相关的,如果session关闭了,代理就不能到数据库中再去取数据了。

    但有时我们往往希望返回的代理获得了实际的数据,如果每次自己都在session关闭之前都亲自调用了某个获得属性的方法,让代理去再次加载,这岂不很麻烦,而且在代码中加入了没什么特殊语义的部分,很有可能被别人删掉,就会出现问题了。hibernate提供了Hibernate.initialize(args)方法对代理对象施行数据的初始化。这个代码就比较有意义了。这样已经初始化了代理,关闭session就不会有问题了。
代码如下:
 static User query(int id) {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        User user = (User) session.load(User.class, 1);
        System.out.println(user.getClass());
        tx.commit();
        Hibernate.initialize(user);
        session.close();
        return user;
    }

接下来,我们进一步分析hibernate实现懒加载的底层机制:
hibernate中用到了两个jar包:asm.jar和cglib.jar。利用这两个包,hibernate可以动态的改变加载入内存的类的字节码。也就是动态生成了代理类。

充: cglib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。

懒加载一般用在,建立了两个对象之间的关联,在加载一个对象时,无需立即加载另一个对象的情况下。

总结: 能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.intialize来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。

注: 使用lazy属性配置懒加载,请参加前面的一对一关联部分。

分享到:
评论

相关推荐

    Hibernate中文学习资料

    本篇将主要围绕`Hibernate3中文参考手册`展开,深入探讨Hibernate的基础概念、配置、实体映射、查询语言以及其他关键特性。 1. **Hibernate概述** Hibernate是一个开源的ORM框架,它提供了对Java应用程序的数据库...

    Hibernate学习笔记

    《Hibernate学习笔记》是一份深度剖析Hibernate框架的教程,旨在为初学者提供全面而深入的指导,帮助他们快速掌握这个强大的Java对象关系映射(ORM)工具。Hibernate作为Java领域中广泛使用的ORM解决方案,它极大地...

    Hibernate-api Hibernate文档

    这篇文档旨在提供对Hibernate API的深入理解,帮助开发者更高效地使用Hibernate进行数据库操作。 一、Hibernate概述 Hibernate是Java开发中广泛使用的ORM框架,它提供了一种在Java应用中持久化数据到关系数据库的...

    hibernate 4.1 core API 英文版

    13. **状态转换**:Hibernate中的对象有三种状态:瞬态(Transient)、持久化(Persistent)和游离(Detached)。对象从一种状态转换到另一种状态,会影响其在数据库中的行为。 14. **动态模型**:Hibernate的...

    Hibernate 用法实例

    本篇内容将通过丰富的实例来深入探讨Hibernate的核心概念和技术,帮助读者从入门到精通,掌握其所有主要用法。** ### 一、Hibernate 概述 Hibernate 提供了一种在Java应用程序中管理关系数据库模型的机制。它通过...

    来自Java Persistence With Hibernate的示例

    本篇将深入探讨“Java Persistence with Hibernate”的核心概念,并通过具体的示例来帮助理解其工作原理和使用方法。 一、Hibernate简介 Hibernate是一个开源的Java库,它提供了在Java应用程序中与关系数据库进行...

    Hibernate v3.2中文参考手册

    <br>阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 <br>阅读第 2 章 体系结构(Architecture)来理解...

    hibernate中文帮助文档

    这篇中文帮助文档旨在为开发者提供详尽的指南,加速他们对Hibernate的理解和应用。 一、Hibernate概述 Hibernate是一个强大的工具,它消除了Java应用程序与SQL之间的直接耦合,使得开发人员可以更专注于业务逻辑,...

    Hibernate3.2官方中文参考手册

    <br>阅读第 1 章 Hibernate入门 ,这是一篇包含详细的逐步指导的指南。本指南的源代码包含在发行包中,你可以在doc/reference/tutorial/目录下找到。 <br>阅读第 2 章 体系结构(Architecture)来理解...

    Hibernate API帮助文档

    这篇文档将深入探讨Hibernate API的各个方面,帮助开发者更好地理解和使用它。 一、Hibernate体系结构 Hibernate主要由以下组件构成: 1. Configuration:负责读取配置文件,建立SessionFactory。 2. ...

    Hibernate基础全攻略

    本篇攻略将深入探讨Hibernate的基础知识,帮助初学者理解并掌握其核心概念。 1. ** Hibernate简介** Hibernate是一个开源的ORM框架,它允许开发人员在Java应用中使用面向对象的方式来处理数据库。通过提供对象与...

    hibernate笔记

    这篇笔记将深入探讨Hibernate的核心概念和技术细节,旨在帮助你更好地理解和应用这个强大的工具。 1. **对象关系映射(ORM)**:ORM是Hibernate的核心,它提供了一种方式,将Java对象模型与数据库表结构进行对应,...

    hibernate文档

    **标题:“Hibernate文档”** ...通过阅读“Hibernate1.ppt”这个文件,你将有机会深入学习这些概念,并掌握如何在实际项目中应用Hibernate。理解并熟练运用这些知识点,将有助于提升你的Java EE开发技能。

    Hibernate入门(上)笔记.pdf.zip

    这篇笔记主要涵盖了Hibernate框架的基础知识,它是Java开发中用于对象关系映射(ORM)的热门工具。Hibernate允许开发者用Java对象来操作数据库,消除了传统的JDBC代码,提高了开发效率和代码的可维护性。 一、...

    Hibernate 中文API 入门和开发的好帮手

    这篇文档是Hibernate的中文API,为学习和使用Hibernate提供了一个直观且易于理解的参考。 一、Hibernate概述 Hibernate是Java领域中广泛使用的ORM框架,它将数据库的操作转换为对Java对象的操作,通过配置文件和...

    Spring.Struts.Hibernate开发应用

    在"第十一章.开发Spring.Struts.Hibernate应用.pdf"这个文件中,可能详细介绍了如何配置和整合这三个框架,包括Spring的bean配置、Struts的action配置、Hibernate的实体映射和数据源设置等。此外,可能还会讲解如何...

    java web技术开发大全(最全最新)

    第13章 国际化 第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16章 用Struts 2实现注册登录系统 第3篇 Hibernate篇 第17章 Hibernate的Helloworld程序 第18章 配置Hibernate 第19章 Hibernate的会话...

    Java.Web整合开发王者归来.part13.rar

    第5篇为Hibernate框架篇;第6篇为Spring框架篇;第7篇为EJB与Web服务篇,内容包括EJB 3概述、JPA规范Web服务框架XFire等;第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志...

    java web开发技术大全

    第13章 国际化 第14章 Struts 2的标签库 第15章 Struts 2对AJAX的支持 第16章 用Struts 2实现注册登录系统 第3篇 Hibernate篇 第17章 Hibernate的Helloworld程序 第18章 配置Hibernate 第19章 ...

    Java Web开发实例大全

    第13章 Dojo框架 第5篇 流行框架篇 第14章 Struts2框架应用 第15章 Struts2框架标签应用 第16章 Hibernate框架基础 第17章 Hibernate高级话题 第18章 Spring框架基础 第19章 Spring的Web MVC框架 第6篇 网站安全与...

Global site tag (gtag.js) - Google Analytics