立即检索的配置文件标识符为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语句了。