学习hibernate关联笔记

对于hibernate的映射关系一直是我心头上的一块病,所以,决定这次把它攻克下来
1.关于映射关系是双向关联还是单向关联,这个完全是根据需求来定制得,没有统一得标准
room和userInfo 一对多 再room.hbm.xml中配置

<set name="users" cascade="all">

<!-- 映射User表的外键roomid -->

<key column="roomid"></key>

<!-- 一对多映射class UserInfo -->

<one-to-many class="UserInfo"></one-to-many>

</set>


userInfo 表中配置

<!-- 映射roomid属性作为UserInfo实体与Room实体的关联,其字段在userinfo表中 -->
<property name="roomid" column="roomid" type="java.lang.Long"/>


假如添加room对象的时候,同时也保存userInfo,假如数据库没有关联关系正常,userInfo的roomid会变成0,所以数据库有关联得话会报错,所以要将userInfo.hbm.xml中配置
<property name="roomid" column="roomid" type="java.lang.Long" insert="false" update="false"/> 


此时假如再userInfo用到room对象就只能双向关联了,hibernate推荐是双向关联
此时就需要将
<property name="roomid" column="roomid"/>
改成
<many-to-one name="room" column="roomid" class="Room" />

假如同样是添加room对象的时候,同时也保存userInfo,此时会执行三条sql语句,第一条,保存room,第二条保存userInfo,让后再更新userInfo得roomId,这样效率就比较低,此时inverse粉墨登场了,可以通过inverse得属性设置将控制权交给userInfo此时需要修改得配置room.hbm.xml
<!-- 通过Room实体的users集合属性映射,级联动作为全部 -->

<!-- 将inverse属性设置为true,表示维护动作由UserInfo实体来完成 -->

<set name="users" cascade="all" inverse="true">

<!-- 映射User表的外键roomid -->

<key column="roomid"></key>

<!-- 一对多映射class UserInfo -->

<one-to-many class="UserInfo"></one-to-many>

</set>


让后再操作的时候
//保证UserInfo实体得到与Room实体的关系,以帮助由UserInfo来维护外键关联
userInfo.setRoom(room);

现在的查询语句变成了两条,第一条是插入room,第二条是插入Userinfo,单向关联不管什么时候都是执行三条sql语句,所以我们推荐使用双向关联,插入数据时inverse一般交给多得那方来配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值