1.单向一对多(只在主控方进行配置)<key column="id">
<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>
在taddress对象中新增User对象,并且去掉原有的user_id及其映射配置。
addr.setTUser(user);
user.getAddress().add(addr);
session.save(user);
执行结果为一条insert sql,以上问题解决。</many-to-one></key>
xml 代码
- <set
- name="address"
- table="t_address"
- cascade="all"
- order-by="user_id"
- lazy="false"
- inverse="true"
- >
- <key column="id" />
- <one-to-many class="bo.TAddress"/>
- </set>
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 代码
- <many-to-one
- name="TUser"
- class="bo.TUser"
- cascade="none"
- outer-join="auto"
- update="false"
- insert="false"
- access="property"
- column="user_id"
- not-null="true"
- />
在taddress对象中新增User对象,并且去掉原有的user_id及其映射配置。
addr.setTUser(user);
user.getAddress().add(addr);
session.save(user);
执行结果为一条insert sql,以上问题解决。</many-to-one></key>