我有两个班级
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图
答案 0 :(得分:1)
这对我来说看起来不像是一对一的关联,因为一个点可能有多个传入链接。它看起来更像是点对点的虚拟对话和链接端的两个多对一关联。
现在,实际映射一对多是非常棘手的,因为它需要映射到子端的两个列。你可以通过在点上有两个集合来解决这个问题,一个用于链接中的每一列,比如传入和传出链接,有效地将无向图转换为有向图,但这会改变逻辑。
具有两个多对一属性的简单映射最容易实现。然后应用程序在删除点之前删除链接,使用hql批量删除操作:从第一个点=:点或第二个点=点的链接中删除。
如果你真的需要hibernate为你做删除,我建议用cascade = delete创建两个集合。
答案 1 :(得分:0)
试试这个
@OneToOne(cascade = CascadeType.REMOVE)