一对多级联操作时外键为null的情况

本文探讨了一对多级联操作中遇到的外键为null的状况。当inverse属性设置为true时,Hibernate不会自动维护关联,导致多方实体的外键未被正确设置。通过测试代码展示问题,并提出了解决方案,即修改inverse属性为false或移除该配置,以确保外键关联的正确建立。

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

问题:在做一对多级联添加时,我在一方配置文件中配置如下

<set name="setLinkMan" cascade="save-update,delete" inverse="true">

inverse="true"的意思时表示放弃关系维护,当做级联添加时,Hibernate并不会帮我们把多的那方设置外键关联,因此虽然数据都添加到数据库,但是多方外键为空

演示

客户(一方)配置文件:

<set name="setLinkMan" cascade="save-update,delete" inverse="true">
    <key column="clid"></key>
    <one-to-many class="com.chao.hbm.entity.LinkMan"/>
</set>

测试代码:

//演示一对多级联保存,简单写法
    @Test
    public void testAddDemo2() {
	SessionFactory sessionFactory = null;
	Session session = null;
	Transaction tx = null;
		
	try {
		//得到sessionFactory
		sessionFactory = HibernateUtils.getSessionFactory();
		//得到session
		session = sessionFactory.openSession();
		//开启事务
		tx = session.beginTransaction();
			
		//添加一个客户,为这个客户添加一个联系人
		//1.创建客户和联系人对象
		Customer customer = new Customer();
		customer.setCustName("京东");
		customer.setCustLevel("vip");
		customer.setCustSource("网络");
		customer.setCustPhone("332");
		customer.setCustMobile("923");
			
		LinkMan linkMan1  = new LinkMan();
		linkMan1.setLkm_name("九尾妖狐");
		linkMan1.setLkm_gender("女");
		linkMan1.setLkm_phone("903");
			
			
		LinkMan linkMan2  = new LinkMan();
		linkMan2.setLkm_name("盖伦");
		linkMan2.setLkm_gender("男");
		linkMan2.setLkm_phone("933");
			
		customer.getSetLinkMan().add(linkMan1);
		customer.getSetLinkMan().add(linkMan2);
		//保存客户
		session.save(customer);
	
		//提交事务
		tx.commit();
			
			
	} catch (Exception e) {
		e.printStackTrace();
		if(tx!=null) tx.rollback();
	}finally {
		session.close();
	}
}

演示结果:


解决办法:

    将inverse="true"设置成inverse="false";或者直接删除这条语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值