连接表

用连接表实现一对多关联

在以前的需求中,如一个客房可以对应多个人。这是一对多关系,当然我们在建数据库时,在user中建立一个roomId也就解决问题了,完全没有必要建立一个连接表,现在问题是我需求变化了,那就是增加一个职业,可以这样理解一个职业对应一群人。常规做法是在user表中增加一个occupationId,仿佛也行。。但请注意,如果在增加呢?是不是这个user表增加了许多给表本身没有关系的字段。如果说在级联删除呢?问题很快就会出来了。

   这样我们利用中间表可以解决上面需求,一对多时,我们可以利用userid做为中间表的主键,如果改为多对多关系,可以改为联合主键做为主键。对于级联删除,使用连接表,级联删除成为可能。如当职业表中删除一条记录,那么连接表中对应的也被删除,不影响用户表中其他记录。

  当然也不是绝对的。如果你很确定两个表之间的关系,用外键关联也是一种解决办法,

  一对多单向关联:是通过设计多端外键来进行的。前提是数据库中没有设置外键关联

否则会出现问题。如何解决:

   设置<property name=”roomId” column=”roomId” type=”java.lang.string” insert=”false” update=”false”/>也就是显式说明该字段是个外源性字段,,注意,insert update默认为true在当前中只需设置insertfalse即可

  一对多双向关联:多端需设置many-to-one,实际结果是这样的,插入userinfo记录时,roomId为空,最后在更新的。

 

   连接表来实现一对多双向关联。

   一端配置:

  Set中所有字段是针对连接表而设置的!

   <set name=”users” cascade=”all” table=”roomusers”>

     <!—通过连接表的一端,因此需要table属性为roomusersà

    <!—key为连接表中的字段,作为外键à

<key column=”roomId”/>

<!—uniquetrue表示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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值