JPA ManyToMany单向关系

时间:2016-05-12 11:38:14

标签: hibernate jpa spring-data hibernate-mapping

假设我们有两个实体,即实体Node和实体ClusterCluster有很多Node个。 Node可以属于多个Cluster。所以在Cluster中有一个@ManyToMany注释。但是Node并不知道它属于(有意)的任何Cluster

当我删除Cluster时,我想保留所有Node(以后我可能会将Node添加到另一个Cluster)。所以我不需要 Cascade.DELETE。但是,如果我删除Node,则应更新其所属的ClusterNode将从其中删除)。

使用JPA处理此问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

那是因为Node不知道它所属的任何Cluster

如果您使用双向关系,则必须选择哪一方更新NodeCluster之间的链接。在业务角度选择最重要的实体...要保存关联,您需要保存关系的拥有实体。

如果您不想要双向关系,则需要先删除所有Node中的Cluster.nodes,然后才能删除Node本身...

答案 1 :(得分:2)

实际上,在单向关系中,您可以使用“Cluster类”中joinColumn="clusterId"注释中的@ManyToMany属性指定关系的holder实体。

这应该是你的代码:

@Entity
@Table(name="Cluster")
public class Cluster {

    //Id and properties

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="Cluster_Nodes", 
                joinColumns={@JoinColumn(name="clusterId")}, 
                inverseJoinColumns={@JoinColumn(name="nodeId")})
    private Set<Node> nodes = new HashSet<Node>();

    // Getter and Setter methods
}

如需进一步阅读,请查看:

Hibernate @ManyToMany Unidirectional and Bidirectional

答案 2 :(得分:0)

我对这个线程太晚了,但我在 Spring Boot 2.4 中遇到了类似的问题。我有 2 个从父实体到同一个子实体的多对多单向关系。

我最终会在连接表中少保存 1 或 2 个实体关系。

然后我意识到我错过了实体/pojo 最基本的东西 - 覆盖 hashCode 和 equals 方法!

一旦我添加了这些,Hibernate 就开始按预期运行。