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.TAddress"/>
</set>
</class>
</hibernate-mapping>


① 这里与前面不同,inverse被设为“true”,这意味着TUser不再作为主控方,而是将关联关系的维护工作交给关联对象org.hibernate.sample.TAddress 来完成。这样TAddress对象在持久化过程中,就可以主动获取其关联的TUser对象的id,并将其作为自己的user_id,之后执行一次insert操作即可完成全部工作。


在one-to-many 关系中,将many 一方设为主动方(inverse=false)将有助性能的改善。(现实中也一样,如果要让胡记住全国人民的名字,估计花个几十年也不可能,但要让全国人民知道hu,可就不需要那么多时间了。J)



<hibernate-mapping>
<class
name="org.hibernate.sample.TAddress"
table="t_address"
dynamic-update="false"
dynamic-insert="false"
>
……
<many-to-one
name="user" ①
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”,即指定由对方维护关联关系,在这里也就是由TAddress维护关联关系。
TUser既然不再维护关联关系,那么TAddress的user_id属性它也自然不会关心,必须由TAddress自己去维护user_id:



many-to-one 节点有以下属性:
属性 描述 类型 必须
name 映射属性 Text Y
column 关联字段。 Text Y
classes 类名
默认为映射属性所属类型 Text N
cascade 操作级联(cascade)关系。
可选值:
all : 所有情况下均进行级联操作。
none:所有情况下均不进行级联操作。
save-update:在执行save-update时
进行级联操作。
delete:在执行delete时进行级联操作。 Text N
update 是否对关联字段进行Update操作
默认:true Bool N
insert 是否对关联字段进行Insert 操作
默认:true Bool N
outer-join 是否使用外联接。
true:总是使用outer-join
false:不使用outer-join
auto(默认) :如果关联对象没有采用
Proxy机制,则使用outer-join. Text N
property-ref 用于与主控类相关联的属性的名称。
默认为关联类的主键属性名。
这里我们通过主键进行关联,所以采用默
认值即可。如果关联并非建立在主键之
间,则可通过此参数指定关联属性。 Text N
access 属性值的读取方式。
可选项:
field
property(默认)
ClassName Text N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值