我有两节课



class Point {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "point_id")
    private Long id;

    @Column(name = "name")
    private String name;
}




class Link {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "link_id")
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToOne
    @JoinColumn(name = "fp_id")
    private Point firstPoint;

    @OneToOne
    @JoinColumn(name = "sp_id")
    private Point secondPoint;
}


如果删除链接,则会出现约束错误。
我想获得以下功能:


删除点->链接自动删除
删除链接->点没有自动删除


如何配置这种关系?

更新
DB图

最佳答案

在我看来,这似乎不是一对一的关联,因为一个点可能有多个传入链接。在点侧看起来像虚拟的一对多,在链接侧看起来像是两个多对一的关联。

现在,实际映射一对多非常棘手,因为需要将其映射到子端的两个列。您可以通过在点上设置两个集合来解决此问题,每个集合用于链接中的每一列(例如传入和传出链接),可以有效地将无向图转换为有向图,但这会改变逻辑。

具有两个多对一属性的简单映射将最容易实现。然后,应用程序应该在删除点之前,通过使用hql批处理删除操作删除链接:从其中firstPoint =:point或secondPoint =:point的链接中删除。

如果您确实需要休眠来为您执行删除操作,我建议您创建两个带有层叠=删除的集合。

10-06 06:46