java - Hibernate单向一对一

标签 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. 删除点 -> 自动删除链接
  2. 删除链接 -> 点未自动删除

如何配置这个关系?

更新 DB图

Diagram of DB

最佳答案

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

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

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

如果您确实需要 hibernate 为您执行删除操作,我建议使用cascade=delete 创建两个集合。

关于java - Hibernate单向一对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25148293/

相关文章:

entity-framework - 首先使用实体​​框架数据库创建一对一关系

jpa - @OneToOne 需要 CascadeType.MERGE 吗?

python - 如何解决这个 django OneToOneField 模型错误?

java - 安卓,改造 2 : How to make calls every 5 second?

java - 我想找到图像的xpath

java - 如何解决 Spring Security 配置问题

Hibernate:需要在事务中保存同一个对象两次

spring - 带有 Java util.Date 的 Postgres 时间戳列

java - 同时使用 , 和 .作为扫描仪类中的分隔符

java - 如何使用 Graphics 类从一个顶点到另一个顶点绘制一条线?