【问题标题】:How to handle mapping of a foreign key of a table to multiple tables primary key?如何处理一个表的外键到多个表主键的映射?
【发布时间】:2018-05-05 04:03:35
【问题描述】:

我有 3 张桌子:

MainTable , Dependent1 , Dependent2.

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

从属 1 表:

@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 表主键的外键。

【问题讨论】:

    标签: java postgresql hibernate jpa jpa-2.0


    【解决方案1】:

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

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

    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 都将从它继承。

    【讨论】:

    • 您的第一种方法不起作用,我不想采用您的第二种方法。
    • 是的。我忘了你有一个复合PK。在这种情况下,您需要使用@JoinColumns 而不是@JoinColumn。参考a nice example in the hibernate docs
    猜你喜欢
    • 2014-05-31
    • 2013-12-09
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2014-06-15
    相关资源
    最近更新 更多