日期:2014-05-16  浏览次数:20439 次

Hibernate 延迟加载,lazy属性配置。以及org.hibernate.LazyInitializationException
<hibernate-mapping>
    <class name="modle.Customers" table="customers" >
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" not-null="true" />
        </property>
        <set name="orderses" inverse="true" cascade="save-update" >
            <key>
                <column name="customer_id"  />
            </key>
            <one-to-many class="modle.Orders" />
        </set>
       
    </class>
</hibernate-mapping>

这是一对多,就是一个 Customers 对应 多个 order


下面是多对一的一方:

<hibernate-mapping>
    <class name="modle.Orders" table="orders" catalog="h_01">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <many-to-one name="customers" class="modle.Customers" fetch="select" lazy="false">
            <column name="customer_id"  />
        </many-to-one>
        <property name="orderName" type="java.lang.String">
            <column name="orderName" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

重要配置解释:

1、inverse 就是反向,是说这种关联关系是对对方控制的,就是many的一方。

inverse="true"
2、lazy  就是是否延迟加载。就是我在需要的时候才去加载,不需要不去加载。

在session关掉后,我们就不能再加载了。

就是常见的: org.hibernate.LazyInitializationException

这时,我们把lazy设为false。

lazy有两种配置方法:

1) 在many-to-one 或 set 中配置:

  <set name="orderses" inverse="true" cascade="save-update" lazy="true">

在one的一方,lazy有3个值:false,true,extra。 默认是true。

延迟加载有很大好处,可以节省sql语句。


在many的一方,lazy有3个值:false,proxy,no-proxy。 注意这里没有true的选项。

一般在查询many的一方时,也会查询one的一方。


2) 在class中配置 :

在class上的lazy只对普通属性起作用,什么set,list统统不起作用,所以set 之类的还要再写