java - Hibernate 级联删除 ConstraintViolationException

标签 java hibernate hibernate-mapping foreign-key-relationship cascade

看起来情况很简单(但它不起作用)。 Db 部分(EVENT_ID 是外键。FK_RR_E_CI 约束引用 EVENT 表)

 |-------|            |----------------|
 | EVENT | 1 ------ ∞ | RECURRENT_RULE |
 |-------|            |----------------|
 | ID    |            | ID             |
 |-------|            | EVENT_ID       |
                      |----------------|

Java 部分:

@Entity
public class Event {
  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "event")
  private Set<RecurrentRule> recurrentRules = new HashSet<>();
}

@Entity
public class RecurrentRule {
  @ManyToOne
  @JoinColumn(columnDefinition = "event_id")
  private Event event;
}

如果我尝试删除事件对象,它将返回:

could not execute statement; SQL [n/a]; constraint [MY_SCHEMA.FK_RR_E_CI]; 
nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
...
java.sql.SQLIntegrityConstraintViolationException: ORA-02292: integrity constraint (MY_SCHEMA.FK_RR_E_CI) violated - child record found

SAVEUPDATE 操作正常。


我应该在我的映射中更改什么才能使用级联删除? 我知道我应该使用 @OnDelete(action=OnDeleteAction.CASCADE) 但我不明白如何使用它...

最佳答案

不是在 @OneToMany 注释中使用 cascade = CascadeType.ALL 属性,而是像这样使用 Hibernate 的 @Cascade() 注释:

@OneToMany(orphanRemoval = true, mappedBy = "event")
@Cascade({CascadeType.ALL})
private Set<RecurrentRule> recurrentRules = new HashSet<>();

因为 cascade = CascadeType.ALL 是一个 JPA 选项,所以当 Hibernate session 试图删除对象时,它会搜索一个 Hibernate Cascade,它不会找到它,这就是为什么你应该使用 @Cascade

要进一步阅读,请查看 Cascade – JPA & Hibernate annotation common mistake , 它给出了更好的解释。

关于java - Hibernate 级联删除 ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44936464/

相关文章:

java - 检查对象列表是否包含字符串

java - 在 Eclipse 运行配置中如何引用用户名?

java - 对于这种情况,如何在 hibernate 中定义唯一约束?

java - 复合键连接列

java - Hibernate - 拥有的实体实例不再引用具有 cascade=”all-delete-orphan” 的集合

java - 对对象的所有引用

java - 将十六进制数转换为长整数

mysql - 在hibernate中添加自表外键

java - Spring:使用 POST 请求保存带有外键的对象

java - hibernate/JPA : storing constants in entity class?