abstractembeddedcomponents.propertyref

<hibernate-mapping package="org.hibernate.test.abstractembeddedcomponents.propertyref">

    <class name="Address" table="ADDRESS" proxy="Address">
        <id name="id" type="long" column="ADDRESS_ID">
            <generator class="native"/>
        </id>
        <discriminator column="ADDRESS_TYPE" type="string" length="30"/>
        <properties name="uniqueAddress">
            <property name="addressType" column="ADDRESS_TYPE" type="string" insert="false" update="false" length="30"/>
            <many-to-one name="server" column="SERVER_ID" class="Server" not-null="true"/>
        </properties>
    </class>

    <subclass name="AddressImpl" extends="Address" discriminator-value="2" proxy="Address">
    </subclass>

    <class name="Server" table="SERVER" proxy="Server">
        <id name="id" type="long" column="SERVER_ID">
            <generator class="native"/>
        </id>
        <discriminator column="SERVER_TYPE" type="string" length="10"/>
        <property name="serverType" type="string" column="SERVER_TYPE" length="10" update="false" insert="false"/>
    </class>

    <subclass name="ServerImpl" extends="Server" discriminator-value="1" proxy="Server">
        <many-to-one name="address"
                     class="AddressImpl"
                     property-ref="uniqueAddress"
                     cascade="all"
                     unique="true"
                     update="false"
                     insert="false">
            <column name="ADDRESS_TYPE"/>
            <column name="SERVER_ID"/>
        </many-to-one>
    </subclass>

</hibernate-mapping>

 

这种ref 用于兼容过去的数据库,a表的属性A1 参照b表的属性B1,但是B1又不是组件,在这种条件下使用ref。

定义复合组件

<properties name="uniqueAddress">
            <property name="addressType" column="ADDRESS_TYPE" type="string" insert="false" update="false" length="30"/>
            <many-to-one name="server" column="SERVER_ID" class="Server" not-null="true"/>
        </properties>

引用2个属性 说以要用properties

name column type length

 

<many-to-one name="address"
                     class="AddressImpl"
                     property-ref="uniqueAddress"
                     cascade="all"
                     unique="true"
                     update="false"
                     insert="false">
            <column name="ADDRESS_TYPE"/>
            <column name="SERVER_ID"/>
        </many-to-one>

 

这里因为有2个属性,不能写到一个many-to-one中 ,所以作为many-to-one的子标签出现。

 

session.createQuery( "from Server s join fetch s.address" ).list(); 这条语句只会返回Server结果 ,同时通过Fetch 把address属性也查找出来。

 select
        server0_.SERVER_ID as SERVER1_1_0_,
        addressimp1_.ADDRESS_ID as ADDRESS1_0_1_,
        server0_.SERVER_TYPE as SERVER2_1_0_,
        server0_.ADDRESS_TYPE as ADDRESS3_1_0_,
        addressimp1_.ADDRESS_TYPE as ADDRESS2_0_1_,
        addressimp1_.SERVER_ID as SERVER3_0_1_
    from
        SERVER server0_
    inner join
        ADDRESS addressimp1_
            on server0_.ADDRESS_TYPE=addressimp1_.ADDRESS_TYPE
            and server0_.SERVER_ID=addressimp1_.SERVER_ID
            and addressimp1_.ADDRESS_TYPE='2'

注意这里on条件,使用了非主键属性关联的,而不是通常意义上的主键,外键关联,说明refproperties起作用了。

 

 

Fetch作用

在我们查询Parent对象的时候,默认只有Parent的内容,并不包含childs的信息,如果在Parent.hbm.xml里设置lazy="false"的话才同时取出关联的所有childs内容.
问题是我既想要hibernate默认的性能又想要临时的灵活性该怎么办?  这就是fetch的功能。我们可以把fetch与lazy="true"的关系类比为事务当中的编程式事务与声明式事务,不太准确,但是大概是这个意思。
总值,fetch就是在代码这一层给你一个主动抓取得机会.


 

你可能感兴趣的:(abstractembeddedcomponents.propertyref)