Hibernate中outer-join与lazy关键字的使用

来源:互联网 发布:blued是什么软件 编辑:程序博客网 时间:2024/05/18 03:24

<Hibernate-mapping>
   <class  name="com.meagle.bo.Order"    table="Orders"    dynamic-update=        "false"   dynamic-insert="false" >
        <id  name="id"  column="Order_ID"   type="int"   unsaved-value="0">
            <generator class="native">
            </generator>
        </id>
        <set   name="orderLineItems"    table="OrderLineItem"   
lazy="true"    inverse="true"   cascade="save-update"     sort="unsorted">
              <key   column="Order_ID" ></key>
              <one-to-many   class="com.meagle.bo.OrderLineItem" />
        </set>
        <property   name="userName"  type="string"  update="true"  insert="true" 
Access="property"
            column="UserName"
            not-null="true"
            unique="false"  />

        <property      name="total"    type="double"    update="true"   insert="true"  access="property"   column="Total"
            not-null="false"
            unique="false"
        />
    </class>
</hibernate-mapping>
//OrderLineItem.hbm.xml
<hibernate-mapping>
    <class    name="com.meagle.bo.OrderLineItem"    table="OrderLineItem"    dynamic-update="false"      dynamic-insert="false" >
        <id   name="id"   column="OrderLineItem_ID"   type="int"   unsaved-value="0">
            <generator class="native">
            </generator>
        </id>
        <many-to-one   name="order"   class="com.meagle.bo.Order"  
cascade="none
"  outer-join="auto"   update="true"
            insert="true"
            access="property"
            column="Order_ID" />     
<property  name="description"  type="string"  update="true"  insert="true"  access="property"  column="Description"      not-null="false"   unique="false"/>  
   <property  name="lineItemPrice"    type="double"    update="true"     insert="true"     access="property"
            column="LineItemPrice"
            not-null="false"
            unique="false"
        />
    </class>
</hibernate-mapping>
近来一直困惑与outer-join关键字,经过多次测试 之后,现总结如下:
1
outer-join关键字(many-to-one的情况)
outer-join
关键字有3个值,分别是true,false,auto,默认是auto

true:
表示使用外连接抓取关联的内容,这里的意思是当使用load(OrderLineItem.class,id)时,Hibernate只生成一条SQL语句将OrderLineItem与他的父亲Order全部初始化。
select * from OrderLineItem o left join Order p on o.OrderId=p.OrderId  where o.OrderLineItem_Id=?
false:
表示不使用外连接抓取关联的内容,当load(OrderLineItem.class,id)时,Hibernate生成两条SQL语句,一条查询OrderLineItem表,另一条查询Order表。这样的好处是可以设置延迟加载,此处要将Order类设置为lazy=true
select * from OrderLineItem o where o.OrderLineItem_Id=?
select * from Order p where p.OrderId=?
auto:
具体是ture还是falsehibernate.cfg.XML中的配置
注意:如果使用HQL查询OrderLineItem,如 from OrderLineItem o where o.id='id',总是不使用外部抓取,及outer-join失效。
2
outer-join(集合)
由于集合可以设置lazy=true“,所以lazyouter-join不能同时为true,当lazy=true“时,outer-join将一直是false,如果lazy=false“,则outer-join用法与1

3
HQL语句会将POJO配置文件中的关联一并查询,即使在HQL语句中没有明确join