【问题标题】:Hibernate many-to-many mapping to the same entity unidirectionalHibernate多对多映射到同一个实体单向
【发布时间】:2020-03-13 15:54:44
【问题描述】:

我有代表树节点种类的表。下面的映射说明了节点的多对多映射。

@Entity
public class Node {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany
    @JoinTable(name = "node_dependency",
            joinColumns = {@JoinColumn(name = "parent_id")},
            inverseJoinColumns = {@JoinColumn(name = "child_id")})
    private List<Node> childNodes = new ArrayList<>();
}

它可以工作,但我希望有单独的表映射以简化删除查询。

@Entity
public class NodeRelation {

    @ManyToOne
    private Node parent;

    @ManyToOne
    private Node child;
}

如果我有 NodeRelation,我可以轻松找到在树的不同层上重复使用并且无法安全删除的节点,这比(节点上的一对多 + 多对一更难做到)在 NodeRelation 中的 FK 上)仅多对多映射。

我尝试了使用 NodeRelation 表示的复合键的不同映射组合,但没有运气(根据 db 架构的验证未通过)。请告诉我在这个用例中哪个映射更好。

【问题讨论】:

    标签: java hibernate jpa hibernate-mapping


    【解决方案1】:

    最好不要在Node 中使用childNodes 关联。

    id添加到NodeRelation会很方便。

    @Entity
    public class Node {
    
        @Id
        @GeneratedValue
        private Long id;
    
    }
    
    @Entity
    public class NodeRelation {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @ManyToOne
        private Node parent;
    
        @ManyToOne
        private Node child;
    
    }
    

    您还可以将唯一约束 (parent, child) 添加到 NodeRelation(具有与 @ManyToMany 连接表相同的行为)。

    它只需要对NodeRelation 表进行查询。

    【讨论】:

    • 您如何看待 NodeRelation 中的复合键?您刚刚提到添加额外的 id 列会更方便。
    • 在我看来,@Ray 复合键不方便与 Hibernate 一起使用。我的意思是自动生成Long id,就像我的例子一样。也可以加unique constraint (parent, child)
    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2022-01-23
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多