对于hibernate的映射关系一直是我心头上的一块病,所以,决定这次把它攻克下来
1.关于映射关系是双向关联还是单向关联,这个完全是根据需求来定制得,没有统一得标准
room和userInfo 一对多 再room.hbm.xml中配置
userInfo 表中配置
假如添加room对象的时候,同时也保存userInfo,假如数据库没有关联关系正常,userInfo的roomid会变成0,所以数据库有关联得话会报错,所以要将userInfo.hbm.xml中配置
此时假如再userInfo用到room对象就只能双向关联了,hibernate推荐是双向关联
此时就需要将
假如同样是添加room对象的时候,同时也保存userInfo,此时会执行三条sql语句,第一条,保存room,第二条保存userInfo,让后再更新userInfo得roomId,这样效率就比较低,此时inverse粉墨登场了,可以通过inverse得属性设置将控制权交给userInfo此时需要修改得配置room.hbm.xml
让后再操作的时候
现在的查询语句变成了两条,第一条是插入room,第二条是插入Userinfo,单向关联不管什么时候都是执行三条sql语句,所以我们推荐使用双向关联,插入数据时inverse一般交给多得那方来配置
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一般交给多得那方来配置