Hibernate单向一对一

时间:2014-08-05 21:04:52

标签: java hibernate one-to-one

我有两个班级

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;
}

如果我删除链接我得到约束错误。 我想获得以下功能:

  1. 删除Point - >链接自动删除
  2. 删除链接 - >点没有自动删除
  3. 如何配置此关系?

    更新 DB图

    Diagram of DB

2 个答案:

答案 0 :(得分:1)

这对我来说看起来不像是一对一的关联,因为一个点可能有多个传入链接。它看起来更像是点对点的虚拟对话和链接端的两个多对一关联。

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

具有两个多对一属性的简单映射最容易实现。然后应用程序在删除点之前删除链接,使用hql批量删除操作:从第一个点=:点或第二个点=点的链接中删除。

如果你真的需要hibernate为你做删除,我建议用cascade = delete创建两个集合。

答案 1 :(得分:0)

试试这个

@OneToOne(cascade = CascadeType.REMOVE)