【问题标题】:JPA ManyToMany unidirectional relationshipJPA ManyToMany 单向关系
【发布时间】:2016-09-08 05:17:20
【问题描述】:

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

当我删除Cluster 时,我想保留所有Nodes(将来我可能会将这些Nodes 添加到另一个Cluster)。所以我不需要 Cascade.DELETE。但是如果我删除一个Node,它所属的所有Cluster 都应该更新(Node 将从它们中删除)。

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

【问题讨论】:

    标签: hibernate jpa spring-data hibernate-mapping


    【解决方案1】:

    这是因为Node 不知道它属于任何Cluster。

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

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

    【讨论】:

    • 是的,它必须是双向的。
    【解决方案2】:

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

    这应该是你的代码:

    @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

    【讨论】:

      【解决方案3】:

      我来这个帖子太晚了,但是我在 Spring Boot 2.4 上遇到了类似的问题。我有 2 个从父实体到同一个子实体的 ManyToMany 单向关系。

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

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

      添加这些后,Hibernate 开始按预期运行。

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 2018-01-21
        • 2012-03-29
        • 2017-12-12
        • 2019-04-11
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多