Cannot delete or update a parent row: a foreign key constraint fails

hibernate+spring项目整合时出现了外键关联时删除的异常

总结一下出现这种状况的几种原因,此处仅分析在hibernate中出现的这种状况,其他情况请参照这篇文章


一、没有配置cascade属性

在oneToMany注解中,没有配置cascade=CascadeType.ALL或者PERSIST等配置

因为在多方存在着一方的外键,当删除一方的时候,没有配置级联删除,默认情况下是不会删除多方数据的

可以稍微动脑想一想,如果在一对多的配置中,一方都已经删除了,多方是不是应该没有意义了,就好像一个班级中有多个学生了,那么如果班级都已经被删除了,

那么学生还属于这个不存在的班级根本就没有什么意义可言了。所以在数据库的方面的设计时,设计师也应该考虑到了这点


二、删除的是瞬时态的一方对象

如果配置了级联删除,但是在删除时仍然会报以上错误,那么就是删除的方式问题

请参看下面一张图:


其实可以清楚的看到,只有在持久状态和游离状态下,准备的说才会有删除的方法存在

那么也就是意味着如果新new出的一个对象,如果被当作一方删除的话,仅仅的只是发出一条查询语句,根本就不可能删除级联的对象


以下是我实际测试的代码:

@Test
	public void testDeleteProducts() {
		AdminProductService aps = getAdminProductService();
		Producttable test2 = new Producttable();
		test2.setProductId(14L);
		
		System.out.println(aps.deleteProducts(test2));
	}
以上代码是Junit测试代码,getAdminProductService()方法是取得对应的service对象,以上采用了直接new对象方法就会报错

而当采用了从session中获取到对象,然后再删除,结果就正确了

@Test
	public void testDeleteProducts() {

		AdminProductService aps = getAdminProductService();
		Producttable test = aps.getProductidByNumber("6876decdfuiexq");
		
		System.out.println(aps.deleteProducts(test));
	}

参考这篇 CSDN讨论,毕竟当时也是困惑了我很久,究其原因还是没有熟练掌握hibernate对象的三种状态

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值