zoukankan      html  css  js  c++  java
  • 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/

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

  • 相关阅读:
    combobox只读代码
    winform中相对路径和绝对路径的获取
    C#中启动外部应用程序
    C#winfrom中应用程序只启动一次代码
    测试计划详细版
    如何编写有效的测试计划
    产品经理,如何面对一句话需求?
    需求评审-软件测试最有效的阶段
    分享一套好用的功能测试用例编写框架
    selenium加载配置文件
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5386225.html
Copyright © 2011-2022 走看看