我的orphanRemoval有问题。当我删除成员并且如果没有给出其他成员引用关系时,应删除此关系。但这种情况并非如此。有JPA配置的moyen,或者我应该在服务中写逻辑?
public class Member {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public RelationEntity getBornRelation() {
return bornRelation;
}
}
public class Relation {
@OneToMany(fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL)
@JoinColumn(name = "bornrelation")
public List<MemberEntity> getChildren() {
return children;
}
}
答案 0 :(得分:1)
首先,您已在try {
br = new BufferedReader(new FileReader("src/files/names.csv"));
} catch (FileNotFoundException e) {
e.printStackTrace();
System.exit(0);
}
和Member
之间定义了两个单独的关联。我怀疑这不是故意的。如果您希望保持关联双向,则需要将Relation
添加到mappedBy="bornRelation"
,以使“一方”成为关联的拥有方。否则,对@OneToMany
的更改不会反映在Member.bornRelation
中,反之亦然。
其次,不将Relation.children
与CascadeType.ALL
一起使用。 @ManyToOne
隐含CascadeType.ALL
,只要“多”侧仍包含引用父实体的其他子实体,尝试删除关联的“一”就会失败。 JPA不会检查是否可以删除。它只会向数据库发出CascadeType.REMOVE
,从而导致违反约束。
(您可以继续将DELETE
与CascadeType.ALL
一起使用,但请记住,在向@OneToMany
添加新元素时,您仍需确保Member.bornRelation
设置正确。不要为你照顾)
我相信以上内容已经回答了你的问题。您想要的只能通过JPA配置完成,您需要额外的逻辑来检查要删除的Relation.children
是否是其父实体的最后一个子节点。顺便说一下,这与孤儿清除无关。孤儿删除是关于删除子实体(而不是父实体)。