hibernate映射技巧one-to-many(双向一对多)
双向一对多关系,实际上是“单向一对多关系”与“多对一关系”的组合。也就是说我们必须在主控方配置单向一对多关系的基础上,在被控方配置多对一关系与其对应。
配置:
上面我们已经大致完成了单向方一对多关系的配置,我们只需在此基础上稍做修改,并对(t_address)的相关属性进行配置即可:
TUser.hbm.xml:
<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
>
……
<set
name="addresses"
table="t_address"
lazy="false"
inverse="true" ①
cascade="all"
sort="unsorted"
order-by="zipcode asc"
>
<key column="user_id"></key>
<one-to-many ①
class="org.hibernate.sample.TUser"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
column="user_id"
not-null="true"
/>
</class>
</hibernate-mapping>
① 在TAddress 对象中新增一个TUser field “user”,并为其添加对应的getter/setter 方法。同时删除原有的user_id 属性及其映射配置,否则运行期会报字段重复映射错误:“Repeated column in mapping”。
为什么会这样,我们已经配置了TAddress的many-to-one关系,这么看来似乎没什么效果……
不过,别忘了上面提到的inverse 属性,这里我们把TUser 的inverse 设为“true”,即指定由对方维护关联关系,在这里?:
field
property(默认)
ClassName Text N