繁体   English   中英

无法删除具有OneToMany关系的记录

[英]Cannot delete a record with OneToMany relation

当我删除表中的记录时,应在另一个表中删除相关记录。 但我接受了:

java.sql.BatchUpdateException:批处理项0更新child_table set parent_table_id = null其中parent_table_id = 63已中止

针对以下设置抛出上述异常:

@OneToMany(cascade = javax.persistence.CascadeType.ALL, targetEntity = ChildTable.class)
@JoinColumn(name = "parent_table_id")
@org.hibernate.annotations.Fetch(FetchMode.SUBSELECT)
public List<ChildTable> getTables() {
    return tables;
}

如果我没有弄错,使用这样的注释,当在ParentTable中删除记录时,应该在Child 1中删除相应的关系。 它会在完全删除之前尝试变为“null”(因为相应的记录不再存在)。 此id列为“not null”。 当我将其设为“null”(仅用于测试此案例)时,一切正常。

你能帮我理解这背后的真正问题是什么吗?

先感谢您。

我通常不使用注释。 我更喜欢hbm映射文件,所以我可以用hbm映射告诉你一些可能的解决方案。 :)我认为你需要在父母一对多关系中添加inverse = true。 始终在您的父集合中放置inverse = true 对于等于inverse = true的注释,请看这个

如果这不起作用,我知道这不是一个好的解决方案,你可以尝试使用not-found =“ignore”或@NotFound(action = NotFoundAction.IGNORE)在父对话中的一对多关系。 最终,它与对数据库中的外键列使用not-null = false具有相同的效果。

其中一位回应者给出了正确答案,但他删除了它。 我不得不使用hibernate Cascade注释而不是JPA注释。 它对我不起作用,因为问题比仅使用JPA和hibernate注释要深一些。 ChildTable的Mapper类具有int类型的parent_table_id,而不是id字段被映射到的ParentTable类类型。所以我将其更改为:

@Entity
@Table(name = "child_table")
public class ChildTable {

private int id;
private int parent_table_id;
...

@Entity
@Table(name = "child_table")
public class ChildTable {

private int id;
private ParentTable parent_table;
...

肯定会进行一些额外的更改(与此相关)并且删除开始按预期工作。

因此,如果在删除一对多关系中的实体期间出现相应的错误,并且注释用法一切正确,请检查类型,您的字段是mapper-classes :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM