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对象的三种状态