在上一篇文章中,Customer中有private Set<Linkman> linkmans = new HashSet<Linkman>(); Linkman中有private Customer customer; 也就是两者都维护了外键。
可以放弃一方面的外键的维护。
一对多可以不用放弃。多对多必须放弃,不然程序会报错。
1. 先测试双方都维护外键的时候,会产生多余的SQL语句。
* 想修改客户和联系人的关系,进行双向关联,双方都会维护外键,会产生多余的SQL语句。
* 产生的原因:session的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的SQL语句。
2. 如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
* 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
* <inverse="true">
接着上一篇的项目。在customer表中添加一个记录xiaofeng。然后,让xiongda变成xiaofeng的联系人。
把customer和linkman的cascade都删除
一、双方维护外键
1.1 测试代码
/**
* 放弃外键的维护 需求:让xiongda联系人属于xiaofeng客户
*/
@Test
public void run11() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 先获取客户
Customer c2 = session.get(Customer.class, 2L);
Linkman l1 = session.get(Linkman.class, 1L);
// 做双向的关联
c2.getLinkmans().add(l1);
l1.setCustomer(c2);
tx.commit();
}