java - 如何处理一个表的外键映射到多个表的主键?

标签 java postgresql hibernate jpa jpa-2.0

我有 3 个表:

主表,依赖 1,依赖 2。

MainTable外键(DependentPK)是表Dependent1和Dependent1的主键。 从 MainTable 到 Dependent1 和 MainTable 到 Dependent2 是一对一的关系。

主表:

@Entity
@Table(name = "mainTable")
@Getter
@Setter
public class MainTable implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO_INCREMENT)
    @Column(name = "id", nullable = false)
    private Integer id;

    @Embedded
    DependentPK key;

    @Column(name = "mainfield1")
    private Integer mainField1;
}

DependentPK(主键):

@Embeddable
@EqualsAndHashCode
@Getter
@Setter
public class DependentPK implements Serializable {

    public DependentPK() {}


    public DependentPK(String field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }


    @Column(name = "field1", nullable = false)
    private String field1;

    @Column(name = "field1", nullable = false)
    private String field1;
}

Dependent1 表:

@Entity
@Table(name = "dependent1")
@Getter
@Setter
public class Dependent1 implements Serializable {

    @EmbeddedId
    private DependentPK id;

    @Column(name = "modified_by")
    private String modifiedBy;

}

Dependent2 表:

@Entity
@Table(name = "dependent2")
@Getter
@Setter
public class Dependent2 implements Serializable {

    @EmbeddedId
    private DependentPK id;

    @Column(name = "name")
    private String name;

}

上面的例子只是为了描述问题。 我无法更改数据库约束和表,因为它是生产数据库。

我的问题是在这种情况下如何使用一对一映射注释?
因为相同的复合键(2 列的组合)作为引用 Dependent1 和 Dependent2 表主键的外键。

最佳答案

您只能定义两个实体之间的关系,不能定义实体与主键之间的关系。

据了解,有两种主要方法可以解决您的问题:

  1. MainTable 中的 Dependent1Dependent2 都有关系:
@OneToOne
@JoinColumn(name = "dependent1_id")
private Dependent1 dependent1;

@OneToOne
@JoinColumn(name = "dependent2_id")
private Dependent2 dependent2;
  1. 如果您只需要Dependent1Dependent2,那么您应该考虑使用某种类型的inheritance for entities。 .然后,您将与 DependentParent 建立单一关系,并且 Dependent1Dependent2 都将从它继承。

关于java - 如何处理一个表的外键映射到多个表的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47417374/

相关文章:

适用于 PostgreSQL 的 Excel 2016 和 ODBC 驱动程序

ruby-on-rails - 当您获得新徽章时,我如何制作类似于 stackoverflow 顶部弹出的酷栏的东西?

PostgreSQL group by but sort inside 聚合函数 (ST_Makeline)

hibernate - 如何在 gradle 中启用 Hibernate Bytecode 增强

java - Codingbat fix45 有更简单的解决方案吗?

java - 使用 Intellij IDEA 2016.2.4 自动缩进返回标记的 JavaDoc

java - 如何在 javafx 中水平增长进度条?

java - 如何比较mysql和JAVA中的二进制文件

java - 如何使用循环引用 hibernate 注解

java - 截断不正确的 INTEGER 值 : '%' in Java and MySQL