`
lms168
  • 浏览: 61556 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

hibernate延迟策略

 
阅读更多

  类级别可选的检索策略包括立即检索和延迟检索,默认为延迟检索。如果<class>元素的lazy属性为true,表示采用延迟检索;如果lazy属性为false,表示采用立即检索。lazy属性的默认值为true。对于类级别的检索策略只影响session的load()方法,对于session的get()方法和hql方法都是无效的。

说明:<1默认情况下session的load()采用延迟加载策略;session的get()和Query的list()或者unique()总是采用立即检索策略

        <2当程序加载一个持久化对象的目的是为了访问它的属性,可以采用立即检索。如果程序加载一个持久化对象的目的是为了获得它的引用,可以采用延迟检索

        <3.在默认的检索策略的情况下,session的oad()方法将会返回以代理,该代理只存在OID属性,当发出getXXX()获取除OID之外的属性时,hibernate才会真正的发出sql语句返回一个真正的对象

        <4.无论是session的load()方法,get()方法或者是Query的list(),unique()方法。当加载“一”的一方的时候,如果“多”的一方采用的是延迟加载策略,那么他们都不会立即执行查询多的一方的select语句。注意load()方法,如果他所对应的“多”的一方采用的是立即检索的策略,此时他也不会把多的一方全部检索出来,除非发出一个除获取OID之外的getXXX()方法

        <5. org.hibernate.Hibernate类的initialize()静态方法用于在session范围内显示初始化代理类对象,isInitialized()方法用于判断代理类实例是否已经被初始化。如以下代码,执行后不会出现人任何错误

写道
public void acquireCustomer(){
Customer customer=(Customer)session.load(Customer.class,2);

if(!Hibernate.isInitialized(customer)){
Hibernate.initialize(customer);
}
tx.commit();
session.close();
System.out.println("sss:"+customer.getName());
}

   

 

    关联级别的检索策略,关联级别的索引包括立即检索,延迟检索和迫切左外连接检索,他们会影响session的load()方法和get()方法,以及Query API和Criteria API;例外情况是Query API会忽略映射文件中设定的迫切左外连接

   在映射文件中,用<set>元素来配置一对多关联及多对多关联关系。<set>元素有lazy和fetch属性

   lazy属性:主要决定‘多’的一方的集合被初始化的时机,即到底是在加载‘一’的一方对象时就被初始化还是在程序访问‘多’的一方的集合时候被初始化

   fetch属性:取值为“select”或“subselect”时,决定初始化‘多’的一方的集合时查询语句的形式;如果取值为‘join’则决定‘多‘的一方的集合被初始化的时机,

   说明:假如没有显示设置lazy和fetch属性,那么采用默认的延迟检索策略。

         如果把fetch的属性设置为join,那么lazy属性被忽略,此时显示设置lazy属性是无意义的

 

 

 以下以Customer与order为例

一,立即检索(lazy的属性为false)

       此时在加载“一”的的一端的对象时会把“多”的一端的所有对象的全部加载,这显示会浪费内存,因此在一对多关联级别中不能随意使用立即检索策略,要优先考虑默认的延迟检索策略

二,延迟检索(lazy的属性为true)

     此时仅仅加载“一”的一端的对象Customer,Customer对象的orders属性引用一个没有初始化的集合代理类实例,换句话说此时orders集合中没有放任何order对象,由此可见,尽管Hibernate会延迟检索与Customer对象关联的order对象,但不会创建Order代理类实例。事实上,这时也无法创建Order代理类实例,因为无法知道与Customer关联的所有Order对象的OID,只有当orders集合代理类实例被初始化时,才会到数据库中检索所有与Customer关联的Order对象,

orders集合代理类实例化的时机

<1.当应用程序第一次访问它,例如调用它的iterator(),size(),isEmpty()或contains()方法,例如

   Set orders=customer.getOrders();

   Iterator it=orders.iterator();            // 导致orders集合代理类被实例化 

<2.通过Hibernate.initialize()方法初始化它

  Set orders=customer.getOrders();

  Hibernate.initialize(orders);   // 导致orders集合代理类被实例化 

 

分享到:
评论

相关推荐

    Hibernate延迟加载以及利用Spring

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

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

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

    hibernate延迟加载解决

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

    HIBERNATE检索策略

    这是HIBERNATE默认的抓取策略,当一个实体被加载时,与之关联的实体或集合并不会立即加载,而是采用延迟加载(Lazy Loading)的方式。当第一次访问关联实体或集合时,HIBERNATE会额外发送一条SELECT语句来抓取数据,...

    hibernate延迟机制分析

    在Java的持久化框架Hibernate中,延迟加载(Lazy Loading)是一种优化策略,旨在提高应用程序的性能和效率。当一个实体的某个属性是一个关联的集合,如一对多的关系,Hibernate默认会采用延迟加载机制。这意味着在...

    hibernate延迟加载技术详细解

    本文将详细探讨 Hibernate 的各种延迟加载策略及其应用场景。 #### 二、Fetching 策略 Fetching 策略定义了 Hibernate 在执行查询时如何获取关联的数据。主要有以下几种: 1. **Join Fetching**:这是一种将主表...

    hibernate 延迟加载.docx

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

    Hibernate延迟加载介绍.doc

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

    Hibernate 延迟加载

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

    Hibernate的延迟加载

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

    hibernate延迟加载

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

    hibernate抓取策略和懒加载案例

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

    Hibernate延迟加载

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

    hibernate的延迟检索在轻量级J2EE框架中的应用

    Hibernate延迟检索的原理 ##### 实体对象的延迟加载 实体对象的延迟加载是指当真正需要某个实体对象的数据时,才执行数据加载操作。在Hibernate中,可以通过在实体的映射配置文件中设置`lazy="true"`来启用实体...

    Hibernate集合属性的延迟加载.doc

    在 Hibernate 框架中,延迟加载(Lazy Loading)是一种优化数据访问性能的重要技术。它允许我们只在真正需要数据时才从数据库加载,避免一次性加载大量数据导致的内存消耗和性能瓶颈。当我们处理与实体相关的集合...

    Flex 与 Hibernate 的延迟加载问题

    本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...

    Hibernate的缓存策略

    ### Hibernate的缓存策略 #### 一、缓存的基本概念 缓存技术是现代软件架构设计中的重要组成部分,尤其在数据库交互频繁的应用场景下尤为重要。简单来说,缓存是一种存储技术,位于应用程序与物理数据之间,目的是...

Global site tag (gtag.js) - Google Analytics