一对多关联

1.单向一对多(只在主控方进行配置)<key column="id">
  
xml 代码
 
  1. <set  
  2.         name="address"  
  3.         table="t_address"  
  4.         cascade="all"  
  5.         order-by="user_id"  
  6.         lazy="false"  
  7.         inverse="true"  
  8.     >  
  9.     <key column="id" />   
  10.     <one-to-many class="bo.TAddress"/>  
  11.     </set>  
<one-to-many class="bo.TAddress"></one-to-many>
user.getAddress().add(addr);
session.save(user);
session.flush();
trans.commit();

插入新的地址记录
save(user):insert into t_address (address, zipcode, tel, user_id, id) values (?, ?, ?, ?, ?)
更新address,将id设置为其关联的user的对象的id值
trans.commit():update t_address set id=? where id=?

因为关联方向是单向,关联关系是tuser对象维持,而被关联的addr对象本身并不知道自己与哪儿个tuser对象关联,也就是说,addr对象本身并不知道自己的user_id应该设成什么数值。
因此,生成的第一条insert并没有包含user_id字段,而是之后根据第一条语句返回的记录id,再通过update语句对user_id字段进行更新。
但是一条insert语句,调用了两个sql,效率低,双向一对多解决了这个问题。


2.双向一对多
实际上是一对多与多对一的关联的组合。也就是说我们必须在主控方配置单向一对多关系的基础上,在被控方配置与其对应的多对一关系。
inverse被设为true,意味着tuser不在作为主控方,而是将关联关系维护工作交给关联对象taddress来完成。
因为,在one-to-many关系中,将many一方设为主控方(inverse=false)将有助于改善性能。

主控方调换后,新增
<many-to-one>
xml 代码
 
  1. <many-to-one   
  2.     name="TUser"  
  3.     class="bo.TUser"  
  4.     cascade="none"  
  5.     outer-join="auto"  
  6.     update="false"  
  7.     insert="false"  
  8.     access="property"  
  9.     column="user_id"  
  10.     not-null="true"  
  11.  />  

在taddress对象中新增User对象,并且去掉原有的user_id及其映射配置。

addr.setTUser(user);
            user.getAddress().add(addr);
            session.save(user);

执行结果为一条insert sql,以上问题解决。</many-to-one></key>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值