用连接表实现一对多关联
在以前的需求中,如一个客房可以对应多个人。这是一对多关系,当然我们在建数据库时,在user中建立一个roomId也就解决问题了,完全没有必要建立一个连接表,现在问题是我需求变化了,那就是增加一个职业,可以这样理解一个职业对应一群人。常规做法是在user表中增加一个occupationId,仿佛也行。。但请注意,如果在增加呢?是不是这个user表增加了许多给表本身没有关系的字段。如果说在级联删除呢?问题很快就会出来了。
这样我们利用中间表可以解决上面需求,一对多时,我们可以利用userid做为中间表的主键,如果改为多对多关系,可以改为联合主键做为主键。对于级联删除,使用连接表,级联删除成为可能。如当职业表中删除一条记录,那么连接表中对应的也被删除,不影响用户表中其他记录。
当然也不是绝对的。如果你很确定两个表之间的关系,用外键关联也是一种解决办法,
一对多单向关联:是通过设计多端外键来进行的。前提是数据库中没有设置外键关联
否则会出现问题。如何解决:
设置<property name=”roomId” column=”roomId” type=”java.lang.string” insert=”false” update=”false”/>也就是显式说明该字段是个外源性字段,,注意,insert update默认为true在当前中只需设置insert为false即可
一对多双向关联:多端需设置many-to-one,实际结果是这样的,插入userinfo记录时,roomId为空,最后在更新的。
连接表来实现一对多双向关联。
一端配置:
Set中所有字段是针对连接表而设置的!
<set name=”users” cascade=”all” table=”roomusers”>
<!—通过连接表的一端,因此需要table属性为roomusers,à
<!—该key为连接表中的字段,作为外键à
<key column=”roomId”/>
<!—unique为true表示userId不可重复,保证一对多关系,事实上,在多对多中只需设置unique=”true”即可等同认为是一对多关系!à
<many-to-many class=”UserInfo” unique=”true” column=”userid”></many-to-many>
</set>
多端配置:
多端配置也是对连接表而设置的
<!—optional表示这是一个外连接!à
<join table=”roomusers” optional=”true” >
<!—该key为连接表中的字段,作为外键à
<key column=”userid”>
<many-to-one name=”room” column=”roomid” not-null=”true”/>
</join>