休眠多对多映射到同一实体单向

问题描述 投票:0回答:1

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

@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,我可以轻松地找到在树的不同层上重复使用并且无法安全删除的节点,而这样做比较困难,而不是(Node on-to-many +一对多on NodeRelation中的FK)仅多对多映射。

我尝试了由NodeRelation表示的具有复合键的映射的不同组合,但是没有运气(未通过根据数据库模式的验证)。请告诉我在该用例中哪种映射更好。

java hibernate jpa hibernate-mapping
1个回答
0
投票

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

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表上进行查询。

© www.soinside.com 2019 - 2024. All rights reserved.