`
baobeituping
  • 浏览: 1068595 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Hibernate 的立即检索策略

阅读更多

立即检索的配置文件标识符为lazy="false"

立即检索表示从数据库中取得的字段值组装好一个对象,会立即再从数据库取数据组装与该对象关联的对象。

这种关系经常用于一对多等关联关系中。

 

例如:班级Team 和学生Student

 

Team:

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.vo.Team" table="team" catalog="mydb8">
     
        <id name="id" type="java.lang.Integer">
           
            <generator class="hilo">
             <param name="table">t_hilo</param>
             <param name="column">hi</param>
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="Name" />
        </property>
        <set name="students" inverse="true" cascade="all" lazy="false">
            <key>
                <column name="TeamID" />
            </key>
            <one-to-many class="com.vo.Student" />
        </set>
    </class>
</hibernate-mapping>

 

Student:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.vo.Student" table="student" catalog="mydb8">
       <id name="id" type="java.lang.Integer">
            <column name="ID" length="11" />
            <generator class="hilo">
             <param name="table">t_hilo</param>
             <param name="column">hi</param>
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="Name" />
        </property>
       
        <many-to-one name="team" class="com.vo.Team"  lazy="false">
            <column name="TeamID" length="11" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>

 

测试客户端:

 

首先我们以取得学生为例。

public static void main(String[] args) {
  Session session = SessionFactory.openSession();
  Student s = (Student) session.get(Student.class, 491520);
  System.out.println(s.getName());
  session.close();

 }

 

如果在student.hbm.xml中增加了红色部分。

<many-to-one name="team" class="com.vo.Team"  lazy="false">
            <column name="TeamID" length="11" not-null="true" />
        </many-to-one>
那么得到的结果不仅加载了学生的对象,同时把学生相关的班级信息也加载了进来。

注释:默认采取的是延迟加载。即lazy="true"

在hibernate3.2中将lazy的选项改为了no-proxy,proxy,false

false:为立即加载。

而其他两者的区别:

举个例子吧:
Child <- many-to-one ->Parent

class Child {
private Parent parent;

public Parent getParent (){
return this.parent;//访问了实例变量
}

}

class Parent {
private String name;

public String getName(){
return this.name;//访问了实例变量
}

public void f(){
System.out.println("invokeing f()");//没有访问实例变量
}
}

如果 many-to-one 的lazy设为proxy,当child.getParent().getName()或child.getParent().f()时,parent都会被抓取,若设为no-proxy,调用child.getParent().f()时,parent是不会被抓取的,同时这种方式需要编译时字节码增强,否则和proxy没区别。

如果设置了 lazy="proxy",就例子来说,当通过 child 来调用其关联的 parent, 如果调用 parent 类中定义的任何方法,都会抓取 parent (所谓的抓取是不是就是从数据库查询,执行一次 select ?)
如果设置了 lazy="no-proxy" ,只有调用 parent 类中牵涉到类变量的方法,才会抓取 parent,否则,就像调用 f(), 不会抓取 parent

然后以获得TEAM为例子:

Session session = SessionFactory.openSession();
  Team s = (Team) session.get(Team.class, 458752);
  System.out.print(s.getName());
  session.close();

 

<set name="students" inverse="true" cascade="all" lazy="false">
            <key>
                <column name="TeamID" />
            </key>
            <one-to-many class="com.vo.Student" />
        </set>

如果为false,那么加载TEAM的时候同时还会发出查询语句去查出STUDENT对象,默认是延迟加载。

 

特别注明:session.get()方法第一次是从缓存中拿数据的。

所以,如果team是立即加载的情况,那么TEAM也会相应的把学生对象都拿出来。如果在SESSION关闭以前,你再去通过session.get()学生对象的时候,就直接从缓存中拿数据,而不再发送SQL语句了。

分享到:
评论

相关推荐

    HIBERNATE检索策略

    标题:“HIBERNATE检索策略” 描述:本文深入解析了HIBERNATE的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在...

    Hibernate的检索策略

    ### Hibernate的检索策略详解 #### 一、概述 在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码...

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

    检索方式及策略”这一主题中,我们将深入探讨如何在Hibernate 5中有效地检索数据以及相关的检索策略。 一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,...

    hibernate的检索

    Hibernate提供三种主要的检索策略:立即检索、延迟检索和迫切左外连接检索。 1. **立即检索**:这种策略将立即加载关联的对象,无论对象是持久化状态还是游离状态。优点是应用程序可以方便地导航到关联的对象,无需...

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

    ### Hibernate的延迟检索在轻量级J2EE框架中的应用 #### 1. 引言 随着互联网技术的发展,Web应用程序的需求日益增加,对于高效、快速的开发模式也提出了更高的要求。轻量级J2EE框架(Struts+Spring+Hibernate)因...

    J2EE Hibernate-6.ppt

    《J2EE Hibernate-6.ppt》探讨了Hibernate在J2EE环境中的检索策略,主要涉及立即检索策略、延迟检索策略以及迫切左外连接检索策略。 1. **立即检索策略**: 立即检索策略是Hibernate默认的检索方式。在处理一对多...

    Hibernate实战笔记

    - **Hibernate中的n+1查询问题**:当使用默认的立即检索策略时,Hibernate会在检索一个对象的同时检索其关联的所有对象。例如,在一个`Customer`与多个`Order`的关联关系中,如果数据库中有`n`个客户,则Hibernate将...

    Hibernate知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述 ...通过以上内容,我们了解了Hibernate的基本概念、配置步骤、核心类以及查询语言和检索策略等内容,这对于高效地使用Hibernate框架是非常有帮助的。

    hibernate面试题2

    【hibernate面试题2】涉及了许多关于Hibernate框架的核心知识点,包括检索策略、SQL日志显示、缓存策略以及Hibernate与其他技术(如Spring和Struts)的整合。下面将逐一详细解析这些概念。 1. **Hibernate检索策略*...

    Hibernate 简单 PPT 总结

    - "2018-7-26-Hibernate-加载策略.pptx"可能涉及了Hibernate的对象状态管理,包括延迟加载、立即加载、批处理加载等策略。 - "05-2018-7-9-Hibernate-配置数据库连接池.pptx"可能介绍了如何在Hibernate中配置和使用...

    hibernate面试题大全

    在Hibernate中,针对关联对象的检索,有三种主要的检索策略:立即检索(Eager Fetching)、延迟检索(Lazy Fetching)和迫切左外连接检索(Anxious Left Join Fetching)。下面将详细探讨这三种策略的特点。 #### 1. 立即...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多和多对多关联的检索策略  16.3.1 立即检索(lazy属性为“false”)  16.3.2 延迟检索(lazy属性为...

    Hibernate总结

    **三、Hibernate的检索策略** 1. **类级别的检索策略** - **立即检索**(默认):`lazy="true"`,加载对象时立即执行SQL。 - **延迟检索**(`lazy="false"`):不立即执行SQL,返回代理对象。 2. **关联的检索...

    Hibernate常见面试题

    ### 三种检索策略及其应用场景 1. **立即检索**:应用程序加载时即获取所有关联对象。适用于类级别的简单关联。 2. **延迟检索**:仅在需要时才加载关联对象,避免不必要的内存占用和提高检索效率。适用于一对多或...

    hibernate教程

    3. **检索策略和方式**:Hibernate支持多种检索策略,如立即加载(eager)、延迟加载(lazy)等,以及HQL(Hibernate Query Language)、原生SQL等多种查询方式。 4. **数据库事务、并发、缓存与性能优化**:事务...

    hibernateSearch+demo

    3. **索引策略**:Hibernate Search 提供了多种索引策略,例如同步索引(即每保存一次实体就立即更新索引)和异步索引(在后台线程中定期更新)。选择哪种策略取决于你的应用需求和性能要求。 4. **查询构造**:...

    Hibernate完全参考手册

    在Hibernate中,Session是持久化操作的主要接口,负责对象的保存、更新、删除以及检索。Transaction管理数据库事务,确保数据的一致性。通常在开始事务、执行一系列操作后,再提交事务。 五、查询语言HQL Hibernate...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多和多对多关联的检索策略  16.3.1 立即检索(lazy属性为“false”)  16.3.2 延迟检索(lazy属性为...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     16.1 Hibernate的检索策略简介  16.2 类级别的检索策略  16.2.1 立即检索  16.2.2 延迟检索  16.3 一对多和多对多关联的检索策略  16.3.1 立即检索(lazy属性为“false”)  16.3.2 延迟检索(lazy属性为...

Global site tag (gtag.js) - Google Analytics