property-ref="uniqueAddress"
cascade="all"
unique="true"
update="false"
insert="false">
这种ref 用于兼容过去的数据库,a表的属性A1 参照b表的属性B1,但是B1又不是组件,在这种条件下使用ref。
定义复合组件
引用2个属性 说以要用properties
name column type length
property-ref="uniqueAddress"
cascade="all"
unique="true"
update="false"
insert="false">
这里因为有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就是在代码这一层给你一个主动抓取得机会.