立即检索的配置文件标识符为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的检索策略详解 #### 一、概述 在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码...
检索方式及策略”这一主题中,我们将深入探讨如何在Hibernate 5中有效地检索数据以及相关的检索策略。 一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,...
Hibernate提供三种主要的检索策略:立即检索、延迟检索和迫切左外连接检索。 1. **立即检索**:这种策略将立即加载关联的对象,无论对象是持久化状态还是游离状态。优点是应用程序可以方便地导航到关联的对象,无需...
### Hibernate的延迟检索在轻量级J2EE框架中的应用 #### 1. 引言 随着互联网技术的发展,Web应用程序的需求日益增加,对于高效、快速的开发模式也提出了更高的要求。轻量级J2EE框架(Struts+Spring+Hibernate)因...
《J2EE Hibernate-6.ppt》探讨了Hibernate在J2EE环境中的检索策略,主要涉及立即检索策略、延迟检索策略以及迫切左外连接检索策略。 1. **立即检索策略**: 立即检索策略是Hibernate默认的检索方式。在处理一对多...
- **Hibernate中的n+1查询问题**:当使用默认的立即检索策略时,Hibernate会在检索一个对象的同时检索其关联的所有对象。例如,在一个`Customer`与多个`Order`的关联关系中,如果数据库中有`n`个客户,则Hibernate将...
### Hibernate知识点总结 #### 一、Hibernate概述 ...通过以上内容,我们了解了Hibernate的基本概念、配置步骤、核心类以及查询语言和检索策略等内容,这对于高效地使用Hibernate框架是非常有帮助的。
【hibernate面试题2】涉及了许多关于Hibernate框架的核心知识点,包括检索策略、SQL日志显示、缓存策略以及Hibernate与其他技术(如Spring和Struts)的整合。下面将逐一详细解析这些概念。 1. **Hibernate检索策略*...
- "2018-7-26-Hibernate-加载策略.pptx"可能涉及了Hibernate的对象状态管理,包括延迟加载、立即加载、批处理加载等策略。 - "05-2018-7-9-Hibernate-配置数据库连接池.pptx"可能介绍了如何在Hibernate中配置和使用...
在Hibernate中,针对关联对象的检索,有三种主要的检索策略:立即检索(Eager Fetching)、延迟检索(Lazy Fetching)和迫切左外连接检索(Anxious Left Join Fetching)。下面将详细探讨这三种策略的特点。 #### 1. 立即...
16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多和多对多关联的检索策略 16.3.1 立即检索(lazy属性为“false”) 16.3.2 延迟检索(lazy属性为...
**三、Hibernate的检索策略** 1. **类级别的检索策略** - **立即检索**(默认):`lazy="true"`,加载对象时立即执行SQL。 - **延迟检索**(`lazy="false"`):不立即执行SQL,返回代理对象。 2. **关联的检索...
### 三种检索策略及其应用场景 1. **立即检索**:应用程序加载时即获取所有关联对象。适用于类级别的简单关联。 2. **延迟检索**:仅在需要时才加载关联对象,避免不必要的内存占用和提高检索效率。适用于一对多或...
3. **检索策略和方式**:Hibernate支持多种检索策略,如立即加载(eager)、延迟加载(lazy)等,以及HQL(Hibernate Query Language)、原生SQL等多种查询方式。 4. **数据库事务、并发、缓存与性能优化**:事务...
3. **索引策略**:Hibernate Search 提供了多种索引策略,例如同步索引(即每保存一次实体就立即更新索引)和异步索引(在后台线程中定期更新)。选择哪种策略取决于你的应用需求和性能要求。 4. **查询构造**:...
在Hibernate中,Session是持久化操作的主要接口,负责对象的保存、更新、删除以及检索。Transaction管理数据库事务,确保数据的一致性。通常在开始事务、执行一系列操作后,再提交事务。 五、查询语言HQL Hibernate...
16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多和多对多关联的检索策略 16.3.1 立即检索(lazy属性为“false”) 16.3.2 延迟检索(lazy属性为...
16.1 Hibernate的检索策略简介 16.2 类级别的检索策略 16.2.1 立即检索 16.2.2 延迟检索 16.3 一对多和多对多关联的检索策略 16.3.1 立即检索(lazy属性为“false”) 16.3.2 延迟检索(lazy属性为...