Hibernate JPA:如何删除单向多对多关系中的链接记录?
我有实体“活动”和“发票”的单向多对多映射。映射仅在活动实体中设置(我不需要从发票端访问活动) 当我运行这些代码时,我认为em将首先从联接表中删除记录,然后删除活动记录(发票记录应保持不变)。但是联接表中的记录从未被删除。我收到此外键错误:Hibernate JPA:如何删除单向多对多关系中的链接记录?,hibernate,jpa,Hibernate,Jpa,我有实体“活动”和“发票”的单向多对多映射。映射仅在活动实体中设置(我不需要从发票端访问活动) 当我运行这些代码时,我认为em将首先从联接表中删除记录,然后删除活动记录(发票记录应保持不变)。但是联接表中的记录从未被删除。我收到此外键错误: [STDOUT] Hibernate: delete from OP_ACTIVITY where OBJECT_ID=? [JDBCExceptionReporter] SQL Error: 1451, SQLState: 23000 ERROR [JD
[STDOUT] Hibernate: delete from OP_ACTIVITY where OBJECT_ID=?
[JDBCExceptionReporter] SQL Error: 1451, SQLState: 23000
ERROR [JDBCExceptionReporter] Cannot delete or update a parent row: a foreign key constraint fails (`prod/op_activity_invoice_xref`.......
我做错了什么?请帮忙,谢谢。我想你需要@manytomy(cascade={CascadeType.REMOVE})
选项
CascadeType.REMOVE:删除实体时,也删除实体
在这个领域举行
在活动中:
@ManyToMany(cascade = {CascadeType.REMOVE})
@JoinTable(name = "OP_ACTIVITY_INVOICE_XREF", joinColumns = @JoinColumn(name = "ACTIVITY_ID", referencedColumnName = "OBJECT_ID"), inverseJoinColumns = @JoinColumn(name = "INVOICE_ID", referencedColumnName = "OBJECT_ID"))
private Set<Invoice> invoices;
或者,您可以在@PreRemove添加注释:
将以下方法添加到不是关系所有者的实体(发票)
尝试添加cascadeType.remove选项,但没有区别。它不会删除链接记录,因此我仍然会收到相同的错误。感谢您的帮助,我发现我的问题与其他问题有关。这是删除链接记录的正确方法(如我前面所说,我不想删除发票):
activity.getInvoices().clear();em.remove(活动)代码>
[STDOUT] Hibernate: delete from OP_ACTIVITY where OBJECT_ID=?
[JDBCExceptionReporter] SQL Error: 1451, SQLState: 23000
ERROR [JDBCExceptionReporter] Cannot delete or update a parent row: a foreign key constraint fails (`prod/op_activity_invoice_xref`.......
@ManyToMany(cascade = {CascadeType.REMOVE})
@JoinTable(name = "OP_ACTIVITY_INVOICE_XREF", joinColumns = @JoinColumn(name = "ACTIVITY_ID", referencedColumnName = "OBJECT_ID"), inverseJoinColumns = @JoinColumn(name = "INVOICE_ID", referencedColumnName = "OBJECT_ID"))
private Set<Invoice> invoices;
for (Invoice invoice : activity.getInvoices()) {
em.remove(invoice);
}
activity.getInvoices().clear();
em.remove(activity);
... flush() etc...
@PreRemove
private void removeInvoicesFromActivities() {
for (Activity a : activities) {
a.getInvoices().remove(this);
}
}