首页 > 解决方案 > JPA如何设计多个表与公用表的一对一关系

问题描述

我有一种情况,很少有表(TableA 和 TableB)与同一个表(TableC)具有一对一的关系。表 A 和表 B 不相关。我设计了如下表格。

TableA
- key
- something
- c_ref_key

TableB
- key
- something
- c_ref_key

TableC
- key
- something

当我使用休眠逆向工程从该数据库生成 JPA 实体时,它会在 TableA 和 TableB 中为 TableC 创建多对一关系。通常要创建一对一的关系,我会将 TableA 主键作为 TableC 的主键,但由于我有其他表(TableB)也与 TableC 具有一对一关系,所以我不能这样做。因此我不得不在 TableA 和 TableB 中使用 TableC 的外键(这导致了 JPA 中的多对一关系)。有没有其他设计方法来保持一对一的关系?或者至少在生成的 JPA 实体中可以有一对一的关系?

标签: databasehibernatejpaforeign-keysentity-relationship

解决方案


您可以使用 @OneToOne 休眠映射和 @JoinColumn 来创建外键。以下是 schema 的基本实现,您可以根据需要对其进行扩展。

表A.java

    @Entity(name = "TABLE_A")
    public class TableA {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long key_a;

        private String something;

        @OneToOne
        @JoinColumn(name = "c_ref_key", referencedColumnName = "key_c")
        private TableC c_ref_key;
    }

表B.java

@Entity(name = "TABLE_B")
public class TableB {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long key_b;

    private String something;

    @OneToOne
    @JoinColumn(name = "c_ref_key", referencedColumnName = "key_c")
    private TableC c_ref_key;
}

表C.java

@Entity(name = "TABLE_C")
public class TableC {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long key_c;

    private String something;
}

我在 MySql 数据库上测试了这个模式,它工作正常。


推荐阅读