hibernate延迟加载

延迟加载!

什么是延迟加载?

延迟加载时一种优化,避免无所谓的性能开销,只有在真正需要使用数据的时候才会进行数据加载操作。

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了 对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。

延迟加载的优势以及讲解:

1、延迟加载的过程中先根据构造方法以及参数建立一个代理对象,调用到一定属性的时候执行里面的getXXX(),当执行到的getXXX()无法查询到值的时候,执行数据加载操作,也就是访问数据库,给代理对象对应属性赋值。如果没有使用延迟加载,代理对象这里会直接加载数据库,就是生成的代理对象为“最终代理对象”。

2、当加载的对象长时间不被使用的时候,该对象会被垃圾回收机制所回收

延迟加载策略原理图片:

应用程序----->代理:装载对象

代理----->数据库:调用代理方法

代理----->垃圾回收:长时间不调用

 

延迟加载优势就是节省系统内存空间。

 

使用延迟加载

1、采用延迟加载策略封的方法实现延迟加载的功能。例如load方法

Student s=session.load(Student.class,1);//1
System.out.println("name:"+s.getName());//2

   在1,2分别断点可以见到延迟加载的现象

2、通过映射文件中的属性实现延迟加载

2.1设置映射文件中的<property>元素中的lazy属性实现延迟加载

<property name="name" type="string" lazy="true" >
  <column name="NAME"/>
</property

2.2设置<class>标签的lazy属性实现延迟加载

<class name="com.hibernate.bean.Student" table="STUDENT" lazy="true">
        <id name="id" type="int">
            <column name="ID" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="description" type="java.lang.String">
            <column name="DESCRIPTION" />
        </property>
    
    </class>

2.3集合类型的延迟加载

 集合类型的延迟加载:

在Hibernate的延迟加载机制中,针对集合类型的应用,意义是最为重大的,因为这有可能 使性能得到大幅度的提高,为此Hibernate进行了大量的努力,其中包括对JDK Collection的独立实现,我们在一对多关联中,定义的用来容纳关联对象的Set集合,并不是java.util.Set类型或其子类型,而是 net.sf.hibernate.collection.Set类型,通过使用自定义集合类的实现,Hibernate实现了集合类型的延迟加载。为了 对集合类型使用延迟加载,我们必须如下配置我们的实体类的关于关联的部分:

<hibernate-mapping>

    <class name=”com.neusoft.entity.User” table=”user”>

…..

<set name=”addresses” table=”address” lazy=”true” inverse=”true”>

<key column=”user_id”/>

<one-to-many class=”com.neusoft.entity.Arrderss”/>

</set>

    </class>

</hibernate-mapping>

通过将<set>元素的lazy属性设置为true来开启集合类型的延迟加载特性。我们看下面的代码:

User user=(User)session.load(User.class,”1”);

Collection addset=user.getAddresses();       (1)

Iterator it=addset.iterator();                (2)

while(it.hasNext()){

Address address=(Address)it.next();

System.out.println(address.getAddress());

}

 

关于延迟加载的源码分析:

我没有深入,别人的链接:http://superleo.iteye.com/blog/243322/

 

延迟加载时代理模式的一种应用。

 

posted @ 2016-04-13 10:56  guodaxia  阅读(165)  评论(0编辑  收藏  举报