我有三张桌子:
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;
}

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;

}

上面的例子只是为了描述这个问题。
我无法更改数据库约束和表,因为它是生产数据库。
我的问题是在这种情况下如何使用一对一的映射注释?因为与引用Dependent1和Dependent2表主键的外键相同的组合键(两列的组合)。

最佳答案

只能定义两个实体之间的关系,而不能定义实体和主键之间的关系。
知道了这一点,有两种方法可以解决您的问题:
与您的Dependent1中的Dependent2MainTable都有关系:

@OneToOne
@JoinColumn(name = "dependent1_id")
private Dependent1 dependent1;

@OneToOne
@JoinColumn(name = "dependent2_id")
private Dependent2 dependent2;

如果你只需要Dependent1或者Dependent2就可以考虑使用某种inheritance for entities。然后您将与aDependentParent有一个单独的关系,Dependent1Dependent2都将从它继承。

08-18 19:27