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语句了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值