<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就是在代码这一层给你一个主动抓取得机会.