我有两个类
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 或 secondaryPoint = :point。
如果您确实需要 hibernate 为您执行删除操作,我建议使用cascade=delete 创建两个集合。
关于java - Hibernate单向一对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148293/