删除成员后,不删除关系

时间:2017-10-28 00:01:34

标签: jpa

我的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;
    }
}

1 个答案:

答案 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.childrenCascadeType.ALL一起使用。 @ManyToOne隐含CascadeType.ALL,只要“多”侧仍包含引用父实体的其他子实体,尝试删除关联的“一”就会失败。 JPA不会检查是否可以删除。它只会向数据库发出CascadeType.REMOVE,从而导致违反约束。

(您可以继续将DELETECascadeType.ALL一起使用,但请记住,在向@OneToMany添加新元素时,您仍需确保Member.bornRelation设置正确。不要为你照顾)

我相信以上内容已经回答了你的问题。您想要的只能通过JPA配置完成,您需要额外的逻辑来检查要删除的Relation.children是否是其父实体的最后一个子节点。顺便说一下,这与孤儿清除无关。孤儿删除是关于删除子实体(而不是父实体)。