我有 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 表主键的外键。
最佳答案
您只能定义两个实体之间的关系,不能定义实体与主键之间的关系。
据了解,有两种主要方法可以解决您的问题:
- 与
MainTable
中的Dependent1
和Dependent2
都有关系:
@OneToOne
@JoinColumn(name = "dependent1_id")
private Dependent1 dependent1;
@OneToOne
@JoinColumn(name = "dependent2_id")
private Dependent2 dependent2;
- 如果您只需要
Dependent1
或Dependent2
,那么您应该考虑使用某种类型的inheritance for entities。 .然后,您将与DependentParent
建立单一关系,并且Dependent1
和Dependent2
都将从它继承。
关于java - 如何处理一个表的外键映射到多个表的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47417374/