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

  转自:http://dev.csdn.net/article/61/61933.shtm

xml 代码
  1. <hibernate-mapping>  
  2.     <class  name="com.meagle.bo.Order" table="Orders" dynamic-update="false"   dynamic-insert="false" >
  3. <id  name="id"  column="Order_ID"   type="int"   unsaved-value="0">  
  4.             <generator class="native">  
  5.             generator>  
  6.         id>  
  7.         <set   name="orderLineItems"    table="OrderLineItem"    lazy="true"    inverse="true"   cascade="save-update"     sort="unsorted">  
  8.               <key   column="Order_ID" >key>  
  9.               <one-to-many   class="com.meagle.bo.OrderLineItem" />  
  10.         set>  
  11.         <property   name="userName"  type="string"  update="true"  insert="true"  access="property"  
  12.             column="UserName"  
  13.             not-null="true"  
  14.             unique="false"  />  
  15.   
  16.         <property      name="total"    type="double"    update="true"   insert="true"  access="property"   column="Total"  
  17.             not-null="false"  
  18.             unique="false"  
  19.         />  
  20.     class>  
  21.   
  22. hibernate-mapping>  
  23.   
  24. <hibernate-mapping>  
  25.     <class    name="com.meagle.bo.OrderLineItem"    table="OrderLineItem"    dynamic-update="false"      dynamic-insert="false" >  
  26.         <id   name="id"   column="OrderLineItem_ID"   type="int"   unsaved-value="0">  
  27.             <generator class="native">  
  28.             generator>  
  29.         id>  
  30.         <many-to-one   name="order"   class="com.meagle.bo.Order"   cascade="none"  outer-join="auto"   update="true"  
  31.             insert="true"  
  32.             access="property"  
  33.             column="Order_ID" />  
  34.   
  35.         <property  name="description"  type="string"  update="true"  insert="true"  access="property"  column="Description"      not-null="false"   unique="false" />  
  36.   
  37.         <property  name="lineItemPrice"    type="double"    update="true"     insert="true"     access="property"  
  38.             column="LineItemPrice"  
  39.             not-null="false"  
  40.             unique="false"  
  41.         />  
  42.     class>  
  43.   
  44. hibernate-mapping>  
  45.   


近来一直困惑与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。

sql 代码
  1. select * from OrderLineItem o where o.OrderLineItem_Id=?   
  2. select * from Order p where p.OrderId=?  



auto:具体是ture还是false看hibernate.cfg.xml中的配置

注意:如果使用HQL查询OrderLineItem,如 from OrderLineItem o where o.id='id',总是不使用外部抓取,及outer-join失效。

2、outer-join(集合)

由于集合可以设置lazy=“true“,所以lazy与outer-join不能同时为true,当lazy=“true“时,outer-join将一直是false,如果lazy=“false“,则outer-join用法与1同

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

 

你可能感兴趣的:(sql,xml,.net,Hibernate,Access)