版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mChenys/article/details/84751696
什么是外键维护?
外键维护就是Hibernate操作数据库的时候会自动更新与之相关联的表的外键值,而如果放弃外键维护的话,那么就仅仅是操作表中的数据,不会修改外键值。
什么时候需要放弃外键维护?
在多对多关系的表中必须要其中一方放弃维护外键,因为维护外键的一方会操作中间表的外键值,而如果2放都来维护的话,就会导致冲突,Hibernate执行的时候也会报错。
在一对多关系的表中可以选择让一的一方(多的一方无法设置)放弃维护外键,这样做的目的是减少产生多余的SQL语句,因为维护外键的一方在更新外键的时候都会执行一条sql语句来操作外键的值。
如何放弃外键维护?
在一对多的关系表中,找到一方的映射文件,在<set >
标签节点上添加inverse="true"
的属性,true:放弃.false:不放弃.默认值是false.例如:
...
<set name="linkmans" inverse="true">
<!-- 外键的字段名 -->
<key column="lkm_cust_id" />
<!-- 多方的全路径 -->
<one-to-many class="blog.csdn.net.mchenys.domain.Linkman" />
</set>
...
在多对多的关系表中,必须要让其中之一放弃维护外键,同样在<set>
标签中添加inverse="true"
,例如:
...
<set name="roles" table="sys_user_role" inverse="true">
<key column="user_id"/>
<many-to-many class="blog.csdn.net.mchenys.domain.Role" column="role_id"/>
</set>
...
cascade和inverse的区别
cascade: 用来级联操作(保存、修改和删除),强调的是操作A表的数据是否会根据关联关系自动操作B表的数据.
inverse: 用来维护外键的值,强调的是由谁来更新外键的字段.
例如在一对多的一方配置了cascade=all,inverse=true,那么在一的一方级联操保存数据的时候就会忽略外键的赋值,外键仍然是null.
示例代码如下:
/**
* 放弃外键的维护
*
*/
@Test
public void test9() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//创建客户
Customer cc = new Customer();
cc.setCust_name("小红");
//创建联系人
Linkman lm = new Linkman();
lm.setLkm_name("李明");
//单项关联
cc.getLinkmans().add(lm);
//一方级联保存
session.save(cc);
// 直接提交,不用手动update,因为持久化状态的对象可以自动更新sql
tr.commit();
}
查看控制台,发现仅仅执行了2条insert语句,并没有看到有针对外键的update语句,这是因为在一方设置级联保存和放弃外键维护的属性.