zoukankan      html  css  js  c++  java
  • 20160510--hibernate懒加载问题

    懒加载
    通过asm和cglib二个包实现;Domain是非final的。
    1.session.load懒加载。
    2.one-to-one(元素)懒加载:
    必需同时满足下面三个条件时才能实现懒加载
    (主表不能有constrained=true,所以主表没有懒加载)
    lazy!=false 2)constrained=true 3)fetch=select
    3.one-to-many (元素)懒加载:1)lazy!=false 2)fetch=select
    4.many-to-one (元素) :1)lazy!=false 2)fetch=select
    5.many-to-many (元素) :1)lazy!=false 2)fetch=select
    6.能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。
     一对一懒加载(对系统影响不算太大)
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.dzq.domain">
    
        <class name="IDCard" table="id_card">
            <id name="id" column="id">
                <generator class="foreign">
                    <param name="property">person</param>
                </generator> 
            <!--     <generator class="native"/> -->
            </id>
            <property name="name" column="name" />
            <one-to-one name="person" constrained="true" lazy="proxy" fetch="join"/> 
        <!-- <many-to-one name="person" column="person_id" unique="true"/> -->
        </class>
       
    </hibernate-mapping>
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.dzq.domain">
    
        <class name="Person" table="person">
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="name" column="name" />
             <one-to-one name="idcard"/>
            <!--  <one-to-one name="idcard" property-ref="person"/> -->
        </class>
       
    </hibernate-mapping>

     多对一懒加载(影响性能,最好不禁用懒加载,使用hibernate初始化代理,解决)

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.dzq.domain">
    
        <class name="Department" table="department">
            <id name="id" column="id">
                <generator class="native" />
            </id>
            <property name="name" column="name" />
             <!-- <set name="empls" cascade="save-update">
                <key column="depart_id"/>
                <one-to-many class="Employee"/>
            </set> -->
            <set name="empls" inverse="true">
                <key column="depart_id"/>
                <one-to-many class="Employee"/>
            </set>
            <!-- <list name="empls">
                <key column="depart_id"/>
                <list-index column="order_col"/>
                <one-to-many class="Employee"/>
            </list> -->
            
            <!-- <bag name="empls">
                <key column="depart_id"/>
                <one-to-many class="Employee"/>
            </bag>
             -->
             
        </class>
       
    </hibernate-mapping>
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.dzq.domain">
    
        <class name="Employee" table="employee" discriminator-value="0">
            <id name="id" column="id">
                <generator class="hilo" />
            </id>
            <!--  <discriminator column="type"/> -->
            <property name="name" column="name" />
            <many-to-one name="depart" column="depart_id" />
            <!-- <subclass name="Skiller" discriminator-value="1">
                <property name="skiller"/>
            </subclass>
            <subclass name="Sales" discriminator-value="2">
                <property name="sell"/>
            </subclass> -->
        <!--     <joined-subclass name="Skiller" table="skiller">
                <key column="emp_id"/>
                <property name="skiller"/>
            </joined-subclass>
            <joined-subclass name="Sales" table="sales">
                <key column="emp_id"/>
                <property name="sell"/>
            </joined-subclass> -->
            <!-- <subclass name="Skiller" discriminator-value="1">
                <property name="skiller"/>
            </subclass>
            <subclass name="Sales" discriminator-value="2">
                <join table="sales">
                    <key column="emp_id"/>
                    <property name="sell"/>
                </join>
                
            </subclass> -->
            <union-subclass name="Skiller">
                <property name="skiller"/>
            </union-subclass>
            <union-subclass name="Sales">
                <property name="sell"/>
            </union-subclass>
        </class>
    
    </hibernate-mapping>
    public static Department queryDepart(int id){
            Session s=null;
            try{
                s=HibernateUntils.getSession();
                Department depart=(Department) s.get(Department.class, id);
                Hibernate.initialize(depart.getEmpls());//hibernate初始化代理
                System.out.println(depart.getEmpls().getClass());
                return depart;
            }finally{
                if(s!=null){
                    s.close();
                }
            }
        }

    多对多懒加载((更加影响性能,最好不禁用懒加载,使用hibernate初始化代理,解决)

  • 相关阅读:
    redis几种数据类型以及使用场景
    Ubuntu16.04安装redis和php的redis扩展
    详细透彻解读Git与SVN的区别(集中式VS分布式)
    bootstrap轮播如何支持移动端滑动手势
    vue添加cnzz统计访问量
    el-tabs值修改时更新路由参数值
    Vue ,elementUI,dropdown组件中command方法添加额外参数的方法
    vue页面滚动监听
    mintui tabbar底部跳转页面
    vue 引入bootstrap
  • 原文地址:https://www.cnblogs.com/xiaoduc-org/p/5477134.html
Copyright © 2011-2022 走看看