我有三张桌子:
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
中的Dependent2
和MainTable
都有关系:
@OneToOne
@JoinColumn(name = "dependent1_id")
private Dependent1 dependent1;
@OneToOne
@JoinColumn(name = "dependent2_id")
private Dependent2 dependent2;
如果你只需要
Dependent1
或者Dependent2
就可以考虑使用某种inheritance for entities。然后您将与aDependentParent
有一个单独的关系,Dependent1
和Dependent2
都将从它继承。