`
KeepCrazy
  • 浏览: 60725 次
社区版块
存档分类
最新评论

hibernate的延迟加载

阅读更多
[size=large]

    先看一段代码:

public class LazyLoadTest {
    @Test
    public void showLazyLoad(){
        Session session=HibernateUtil.getSession();
       
        Major major=(Major) session.load(Major.class, 1);
        session.close();
        
        //print the name of this major
        System.out.println(major.getName());
    }
}

    代码的逻辑是:查询出id为1的major, 并输出其名字. 很明显, 代码的逻辑是对的.   可一运行就会报错:

引用

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

 
翻译过来就是:  延迟加载异常:不能初始化代理 --- session不存在. 出现这个报错信息的原因就在于hibernate的延迟加载机制.

    所谓的延迟加载就是程序在使用load, iterator方法执行查询及关联查询时, 并不会马上发送并执行sql语句, 而是在调用(被查询)对象属性的getter方法时才去执行查询.
所以若将代码改为:

     Major major=(Major) session.load(Major.class, 1);
     major.getName();
     session.close();
     System.out.println(major.getName());

则能正常运行
   可这样做了无用功, 因为major.getName()方法的调用没有体现出任何业务逻辑.应通过使用不同的方法来避免延迟加载.如:

     Major major=(Major) session.get(Major.class, 1);
     session.close();
     System.out.println(major.getName());

将load方法替换为get方法后程序也能正常运行.

    hibernate延迟加载机制是默认开启的, 但只在三种情况下出现延迟加载:使用session的load方法, query的iterator方法进行查询及关联查询时.  相应的避免方法为:
    session.load--->session.get
    query.iterator---> query.list
    关联查询:有两种方法:a.修改配置文件:在映射文件中给关联映射元素添加fetch='join'属性; b.在hql语句中使用join fetch 关键字. a不如b灵活, 建议使用b.

    还有一个小小的陷阱:

     Major major=(Major) session.load(Major.class, 1);
     major.getId();
     session.close();
     System.out.println(major.getName());


猜猜看这段代码是否能正常运行? 用load方法将major查询出来后调用其id属性的get方法, 照理说应该能正常运行, 但结果却会报错, 错误信息和第一段代码一样.
这又是什么原因呢? 原来在使用load方法时, major对象的id属性已经给出了, 在调用其id的get方法时不需要执行查询操作.所以major.getId();这句代码有和没有是一个样, 程序都不会去执行真正的查询操作.

上面这些现象也许会让人觉得它的存在纯粹是一个麻烦精, 可事实是延迟加载的好处是大大的有: 它可以降低数据库访问的并发率, 还可以极大的提高关联查询的效率, 因为它使程序在查询数据时可以做到用到时才查, 不用时不查, 减少了不必要的内存开销.
所以hibernate延迟加载机制的存在有理由,有好处,也有坏处. 在使用时只要注意不过早关闭session,就会发现它还是挺好用的.

(数据库表格见http://keepcrazy.iteye.com/blog/1753444的附件)
[/size]
0
7
分享到:
评论

相关推荐

    Hibernate延迟加载以及利用Spring

    ### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...

    hibernate 延迟加载深入剖析

    ### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...

    Hibernate 延迟加载剖析与代理模式应用

    《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...

    hibernate延迟加载解决

    ### Hibernate延迟加载详解 #### 一、什么是延迟加载? 延迟加载是一种优化技术,在软件开发中广泛应用于各种场景,尤其在数据库交互中尤为重要。其核心思想是仅在确实需要某个资源时才加载它,而非一开始就加载...

    什么是hibernate延迟加载

    详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助

    Hibernate延时加载与lazy机制.doc

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

    Hibernate 延迟加载

    ### Hibernate延迟加载详解 #### 什么是Hibernate延迟加载? 在探讨Hibernate延迟加载之前,我们先简要回顾一下Hibernate框架。Hibernate是一种流行的Java持久层框架,它提供了对象关系映射(ORM)的功能,允许...

    Hibernate延迟加载机制.zip

    Hibernate延迟加载机制.zip

    hibernate 延迟加载.docx

    【hibernate 延迟加载】 在Java的持久化框架Hibernate中,延迟加载(Lazy Loading)是一种优化数据库访问性能的技术。它允许我们在需要时才加载关联的对象,而不是在初始查询时就一次性加载所有数据。这有助于减少...

    Hibernate延迟加载

    Hibernate延迟加载是ORM框架Hibernate中的一个重要特性,它旨在提高应用程序的性能和效率。延迟加载(Lazy Loading)策略允许我们仅在需要访问一个对象或其属性时才从数据库加载它们,而不是在初始加载实体时就一次...

    hibernate延迟加载技术详细解

    ### Hibernate 延迟加载技术详解 #### 一、概述 在 Hibernate 框架中,延迟加载(Lazy Loading)是一种非常重要的优化技术,它能够有效地减少数据库查询次数,提高应用性能。通常,在多对多或者一对多的关系中,...

    hibernate延迟加载

    ### Hibernate延迟加载详解 #### 一、概述 Hibernate 是一种常用的 Java 持久层框架,它能够将 Java 应用程序与底层数据库之间建立桥梁,简化数据访问逻辑。为了提高应用程序性能,Hibernate 提供了多种优化手段,...

    Hibernate延迟加载介绍.doc

    《Hibernate延迟加载详解》 Hibernate作为Java领域中的一个强大的对象关系映射框架,提供了许多优化数据库操作的策略,其中之一便是延迟加载(Lazy Loading)。延迟加载机制旨在减少不必要的性能消耗,只在真正需要...

    【北大青鸟内部教程】jsp中关于Hibernate延时加载的问题

    在处理大数据量或者复杂数据结构时,Hibernate引入了延时加载(Lazy Loading)机制,以提高应用程序的性能。本文将深入探讨在JSP(JavaServer Pages)环境中,如何理解和应对Hibernate的延时加载问题。 首先,我们...

    Hibernate的延迟加载

    集合类型的延迟加载是Hibernate延迟加载机制中最能显著提升性能的部分。在Hibernate中,集合类型的延迟加载通过使用自定义的集合类实现,如`net.sf.hibernate.collection.Set`,而非标准的`java.util.Set`。这样,...

    Hibernate延迟加载案例 (多: 一: 一,附代码)

    本案例主要探讨的是Hibernate的延迟加载(Lazy Loading)机制,这是一种优化数据库访问性能的重要策略。延迟加载允许我们在需要数据时才去加载,而不是在初始化对象时一次性加载所有关联数据,从而减少了内存消耗和...

Global site tag (gtag.js) - Google Analytics