Hibernate的学习之路二十四(放弃外键的维护)

本文探讨了在数据库多对多关系中如何通过调整外键维护方式减少不必要的SQL语句生成,介绍了通过设置inverse属性实现这一目标的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

    这篇主要是说明了,放弃外键,在数据库多对多的情况下要放弃,其中一方的外键维护。因为会造成语句的多余。
    比如A表和B表,A里有B的维护,B里有A的维护,如果互相修改的话,映射一下,A和B都会生成1个sql语句来修改,一共2条来执行相同结果的sql语句,其实只要修改一次就可以。
    当然如果在一对多的情况下,就不需要去放弃外键的维护了,还有就是放弃的一方  是一的。需要设置属性。

分析

技术分析之让某一方放弃外键的维护,为多对多做准备

1. 先测试双方都维护外键的时候,会产生多余的SQL语句。
    * 想修改客户和联系人的关系,进行双向关联,双方都会维护外键,会产生多余的SQL语句。

    * 产生的原因:session的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的SQL语句。

2. 如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
    * 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
    * <inverse="true">
以下是代码,记得要在mapping文件里设置inverse,只要设置一对多中的一,是放弃外键维护就行,外键是没有这个属性的。

	/**
	 * 放弃外键的维护
	 * 需求:让熊大联系人属于小风客户
	 */
	@Test
	public void run11(){
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		// 先获取到小风的客户
		Customer c2 = session.get(Customer.class, 2L);
		Linkman l1 = session.get(Linkman.class, 1L);
		
		// 做双向的关联
		c2.getLinkmans().add(l1);
		
		l1.setCustomer(c2);
		// 不用修改
		tr.commit();
	}

其他

至于为什么要在一中设置inverse来设置,而不在多中设置呢?一对多,   一个人维护多个,和多个人主动找一个人维护。肯定是后者比较简单呀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值