七、Hibernate映射之放弃外键的维护

版权声明:本文为博主原创文章,未经博主允许不得转载。 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语句,这是因为在一方设置级联保存和放弃外键维护的属性.

猜你喜欢

转载自blog.csdn.net/mChenys/article/details/84751696