当我删除表中的记录时,应该在另一个表中删除相关记录。但我接受了:
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”(仅用于测试此案例)时,一切正常。
你能帮我理解这背后的真正问题是什么吗?
提前谢谢。
答案 0 :(得分:0)
我通常不使用注释。我更喜欢hbm映射文件,所以我可以用hbm映射告诉你一些可能的解决方案。 :)我认为你需要在父母一对多关系中添加inverse = true。 Always put inverse=true in your parent collections。对于等于inverse = true的注释,请参阅this。
如果这不起作用,我知道这不是一个好的解决方案,你可以尝试在一对多中使用not-found =“ignore”或@NotFound(action = NotFoundAction.IGNORE)父母的关系。最终,它与对数据库中的外键列使用not-null = false具有相同的效果。
答案 1 :(得分:0)
其中一位回复者给出了正确答案,但他删除了答案。 我不得不使用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中的字段类型:)