我有两节课
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的链接中删除。
如果您确实需要休眠来为您执行删除操作,我建议您创建两个带有层叠=删除的集合。