<many-to-one> 元素也有一个 lazy 属性和fetch 属性.
<hibernate-mapping package="com.baidu.oneManyToOneStrategy">
<class name="Card" table="CARDS">
<id name="cardId" type="java.lang.Integer">
<column name="CARD_ID" />
<generator class="native" />
</id>
<property name="cardName" type="java.lang.String">
<column name="CARD_NAME" />
</property>
<!-- 使用many-to-one 的方式来映射 one-to-one关联关系的外键 -->
<many-to-one name="person" class="Person" column="PERS_ID"
unique="true" ></many-to-one>
</class>
</hibernate-mapping>
/**
*
* 1. lazy 取值为 proxy 和false 分别代表对应的属性采用延迟检索和立即检索
* 2. fetch 取值为join ,表示使用迫切左外连接的方式初始化n 关联的1 的端的属性。
* 3. batch-size,该属性需要设置在1 那一端class 元素中:
* <class name="Person" table="PERSONS" batch-size="2">
* 作用:一次初始化1 的这一端代理对象的个数。
*
*/
lazy 属性:
① 不配置lazy 属性时,
运行的SQL
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_0_,
card0_.CARD_NAME as CARD_NAM2_0_0_,
card0_.PERS_ID as PERS_ID3_0_0_
from
CARDS card0_
where
card0_.CARD_ID=?
② lazy 属性取值为fasle 时,立即检索
运行的SQL
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_0_,
card0_.CARD_NAME as CARD_NAM2_0_0_,
card0_.PERS_ID as PERS_ID3_0_0_
from
CARDS card0_
where
card0_.CARD_ID=?
Hibernate:
select
person0_.PERSON_ID as PERSON_I1_1_1_,
person0_.PERSON_NAME as PERSON_N2_1_1_,
person0_.AGE as AGE3_1_1_,
card1_.CARD_ID as CARD_ID1_0_0_,
card1_.CARD_NAME as CARD_NAM2_0_0_,
card1_.PERS_ID as PERS_ID3_0_0_
from
PERSONS person0_
left outer join
CARDS card1_
on person0_.PERSON_ID=card1_.PERS_ID
where
person0_.PERSON_ID=?
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_0_,
card0_.CARD_NAME as CARD_NAM2_0_0_,
card0_.PERS_ID as PERS_ID3_0_0_
from
CARDS card0_
where
card0_.PERS_ID=?
③lazy 属性取值为proxy时,延迟检索
运行的SQL
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_0_,
card0_.CARD_NAME as CARD_NAM2_0_0_,
card0_.PERS_ID as PERS_ID3_0_0_
from
CARDS card0_
where
card0_.CARD_ID=?
④lazy 属性取值为no-proxy时,无代理延迟检索
运行的SQL
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_0_,
card0_.CARD_NAME as CARD_NAM2_0_0_,
card0_.PERS_ID as PERS_ID3_0_0_
from
CARDS card0_
where
card0_.CARD_ID=?<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
fetch属性
<many-to-one name="person" class="Person" column="PERS_ID"
unique="true" lazy="false" fetch="join" ></many-to-one>
@Test
public void testMany2OneStrategy() {
Card card = (Card) session.get(Card.class, 1);
System.out.println(card.getPerson().getPersonName());
}
运行的SQL
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_1_,
card0_.CARD_NAME as CARD_NAM2_0_1_,
card0_.PERS_ID as PERS_ID3_0_1_,
person1_.PERSON_ID as PERSON_I1_1_0_,
person1_.PERSON_NAME as PERSON_N2_1_0_,
person1_.AGE as AGE3_1_0_
from
CARDS card0_
left outer join
PERSONS person1_
on card0_.PERS_ID=person1_.PERSON_ID
where
card0_.CARD_ID=?
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_1_,
card0_.CARD_NAME as CARD_NAM2_0_1_,
card0_.PERS_ID as PERS_ID3_0_1_,
person1_.PERSON_ID as PERSON_I1_1_0_,
person1_.PERSON_NAME as PERSON_N2_1_0_,
person1_.AGE as AGE3_1_0_
from
CARDS card0_
left outer join
PERSONS person1_
on card0_.PERS_ID=person1_.PERSON_ID
where
card0_.PERS_ID=?
Person-1
batch-size 属性:
@Test
public void testMany2OneStrategy() {
List<Card> cards = session.createQuery("FROM Card c").list();
for(Card card1:cards){
if(card1.getPerson() != null){
System.out.println(card1.getPerson().getPersonName());
}
}
}
<hibernate-mapping package="com.baidu.oneManyToOneStrategy">
<class name="Person" table="PERSONS" batch-size="2">
<id name="personId" type="java.lang.Integer">
<column name="PERSON_ID" />
<generator class="native" />
</id>
<property name="personName" type="java.lang.String">
<column name="PERSON_NAME" />
</property>
<property name="age" type="java.lang.Integer">
<column name="AGE" />
</property>
<one-to-one name="card" class="Card" property-ref="person" ></one-to-one>
</class>
</hibernate-mapping>
因为使用的HQL查询,会忽略fetch配置
运行的结果:Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_,
card0_.CARD_NAME as CARD_NAM2_0_,
card0_.PERS_ID as PERS_ID3_0_
from
CARDS card0_
Hibernate:
select
person0_.PERSON_ID as PERSON_I1_1_1_,
person0_.PERSON_NAME as PERSON_N2_1_1_,
person0_.AGE as AGE3_1_1_,
card1_.CARD_ID as CARD_ID1_0_0_,
card1_.CARD_NAME as CARD_NAM2_0_0_,
card1_.PERS_ID as PERS_ID3_0_0_
from
PERSONS person0_
left outer join
CARDS card1_
on person0_.PERSON_ID=card1_.PERS_ID
where
person0_.PERSON_ID in (
?, ?
)
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_1_,
card0_.CARD_NAME as CARD_NAM2_0_1_,
card0_.PERS_ID as PERS_ID3_0_1_,
person1_.PERSON_ID as PERSON_I1_1_0_,
person1_.PERSON_NAME as PERSON_N2_1_0_,
person1_.AGE as AGE3_1_0_
from
CARDS card0_
left outer join
PERSONS person1_
on card0_.PERS_ID=person1_.PERSON_ID
where
card0_.PERS_ID=?
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_1_,
card0_.CARD_NAME as CARD_NAM2_0_1_,
card0_.PERS_ID as PERS_ID3_0_1_,
person1_.PERSON_ID as PERSON_I1_1_0_,
person1_.PERSON_NAME as PERSON_N2_1_0_,
person1_.AGE as AGE3_1_0_
from
CARDS card0_
left outer join
PERSONS person1_
on card0_.PERS_ID=person1_.PERSON_ID
where
card0_.PERS_ID=?
Person-1
Person-2
Hibernate:
select
person0_.PERSON_ID as PERSON_I1_1_1_,
person0_.PERSON_NAME as PERSON_N2_1_1_,
person0_.AGE as AGE3_1_1_,
card1_.CARD_ID as CARD_ID1_0_0_,
card1_.CARD_NAME as CARD_NAM2_0_0_,
card1_.PERS_ID as PERS_ID3_0_0_
from
PERSONS person0_
left outer join
CARDS card1_
on person0_.PERSON_ID=card1_.PERS_ID
where
person0_.PERSON_ID=?
Hibernate:
select
card0_.CARD_ID as CARD_ID1_0_1_,
card0_.CARD_NAME as CARD_NAM2_0_1_,
card0_.PERS_ID as PERS_ID3_0_1_,
person1_.PERSON_ID as PERSON_I1_1_0_,
person1_.PERSON_NAME as PERSON_N2_1_0_,
person1_.AGE as AGE3_1_0_
from
CARDS card0_
left outer join
PERSONS person1_
on card0_.PERS_ID=person1_.PERSON_ID
where
card0_.PERS_ID=?
Person-3