Hibernate中outer-join与lazy关键字的使用
2007-08-22 23:48
477 查看
<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>
<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="des cription" type="string" update="true" insert="true" access="property" column="Des cription" 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还是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。
<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>
<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="des cription" type="string" update="true" insert="true" access="property" column="Des cription" 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还是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。
相关文章推荐
- Hibernate中outer-join与lazy关键字的使用- -
- Hibernate中outer-join与lazy关键字的使用
- Hibernate中outer-join与lazy关键字的使用
- Hibernate中outer-join、lazy 、fetch join关键字的使用
- Hibernate中outer-join、lazy 、fetch join关键字的使用
- Hibernate中outer-join、lazy 、fetch join关键字的使
- Hibernate中outer-join与lazy关键字的使用
- Hibernate中outer-join、lazy 、fetch join关键字的使用
- hibernate中HQL查询补充(联合查询,inner join,left outer join,子查询的使用)
- Hibernate中的fetch, lazy, outer-join,inverse和cascade作用
- Hibernate中outer-join与lazy关键字的使用
- Hibernate中hbm.xml文件的inverse、cascade、fetch、outer-join、lazy
- inner/outer join in hibernate
- 在oracle的连接(join)中使用using关键字
- Scala中lazy关键字的使用和理解
- 转载--使用Partitioned Outer Join实现稠化报表
- jpa或bernate使用原生sql进行关联查询org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join
- oracle连接(join)中使用using关键字
- hibernate中lazy的使用
- outerDocument : 使用itemRender 和item Editor时想要访问外部量的关键字