我在 JPA 中有两个实体,class1 和 class2,具有以下结构:
// class1
@Embeddable
public class Class1Id {
@Column(name = "col_one")
String column1;
@Column(name = "col_two")
String column2;
}
@Entity
public class Class1 {
@EmbeddedId
Class1Id class1Id;
@OneToMany(mappedBy = "class1")
List<Class2> class2List;
}
// class2
@Embeddable
public class Class2Id {
@Column(name = "col_one")
String column1;
@Column(name = "col_three")
Integer column3;
}
@Entity
public class Class2 {
@EmbeddedId
Class2Id class2Id;
@ManytoOne
@JoinColumn(name = "col_one", referencedColumnName = "col_one")
Class1 class1;
}
我想在class1和class2之间创建多对一关系,但只使用column1(即col_one),这在class1和class2中都很常见。
有没有办法仅使用 column1 链接 JPA 中的这两个类,即使它们具有不同的 EmbeddedId 结构?如何正确映射这种关系?
当然,您可以仅使用
Class1
字段在 Class2
和 column1
之间建立多对一关系,即使它们具有不同的 EmbeddedId 结构。您需要使用 @MapsId
注释来正确映射关系。请按照以下步骤操作:
Class2
以使用 @MapsId
将 column1 字段映射到 Class1
实体。Class2Id
类具有与 column1
中的 column1
匹配的 Class1Id
字段。// Class1Id
@Embeddable
public class Class1Id {
@Column(name = "col_one")
String column1;
@Column(name = "col_two")
String column2;
}
// Class1
@Entity
public class Class1 {
@EmbeddedId
Class1Id class1Id;
@OneToMany(mappedBy = "class1")
List<Class2> class2List;
}
// Class2Id
@Embeddable
public class Class2Id {
@Column(name = "col_one")
String column1;
@Column(name = "col_three")
Integer column3;
}
// Class2
@Entity
public class Class2 {
@EmbeddedId
Class2Id class2Id;
@MapsId("column1")
@ManyToOne
@JoinColumn(name = "col_one", referencedColumnName = "col_one")
Class1 class1;
}
在
Class2
中,@MapsId("column1")
注释告诉JPA应该使用Class2Id中的column1字段将关系映射到Class1
。
@JoinColumn(name = "col_one", referencedColumnName = "col_one")
注释指定 Class2
中的 col_one 列应用于与 Class1
中的 col_one 列连接。