多对一和一对一关联的检索策略


 <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());
	}


fetch 取值为join 时, 那么 lazy 属性被忽略

运行的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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值