如何解决为什么即使使用CascadeType.ALL也有DataIntegrityViolationException?
我有一个具有以下关系的表:
parent
| \
child1 child1
/ \
grandchild1 grandchild2
我打电话给孙子,子女和父母只是为了说明问题。这不是继承问题
@Entity
@Table(name = “parent")
@Data
@EqualsAndHashCode(callSuper = true,exclude = { “..." })
@ToString(exclude = { “..." })
@NoArgsConstructor
public class Parent {
private static final long serialVersionUID = 1L;
@OneToMany(mappedBy = “parent")
@Cascade({org.hibernate.annotations.CascadeType.ALL})
private Set<Child> children;
}
Child.java
@Entity
@Table(name = “child")
@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class Child {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name = “parent_id")
private Parent parent;
@OneToMany(mappedBy = “child")
@Cascade({org.hibernate.annotations.CascadeType.ALL})
@LazyCollection(LazyCollectionOption.FALSE)
private List<Grandchild> grandchildren = new ArrayList<>();
}
我正尝试直接使用CascadeType.ALL删除父级,我看不到任何问题。但是当我尝试删除时,我得到了:
08-26 11:36:33,755错误[SqlExceptionHelper]无法删除或更新 父行:外键约束失败(
database
。child
, 约束FK_abcdefg12345
外键(parent_id
)参考parent_id
(id
))2020-08-26 11:36:33,773 INFO [AbstractBatchImpl] HHH000010:在批量发布时,它仍然包含JDBC语句 2020年8月26日11:36:33.776警告[http-nio-8080-exec-6] com.sun.faces.lifecycle.InvokeApplicationPhase.execute#{delete()}: org.springframework.dao.DataIntegrityViolationException:无法 执行语句SQL [n / a];约束[null];嵌套异常为 org.hibernate.exception.ConstraintViolationException:无法 执行语句
我认为从JPA导入CascadeType而不是从org.hibernate导入CascadeType可能是一个错误。我还尝试仅使用JPA代码,例如 @OneToMany(mappedBy =“ parent”,orphanRemoval = true,cascade = CascadeType.ALL)。
代码
parent.setChildren(null);
parentRepository.delete(parent); //throws the exception
依赖项
- Spring Data JPA 1.7.0
- 休眠4.2.1。最终版本
- Spring Integration JDBC 2.2.6
- Spring Integration JPA 2.2.6
我在做什么错了?
解决方法
即使将关系定义为双向,级联删除也始终是单向的。
当您从外键引用的主表中删除时,引用该条目的条目将被删除。
我将在您用JoinColumn注释的属性(具有名称的属性)而不是映射的属性中建立级联删除。
通过删除祖父,应该删除其子孙。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。