我有@Entity类作为
@Entity
@Table(name = "EMPLOYEE")
public class Emplyee
{
@Id
@Column(name = "ID", length = 50)
private String id;
@Column(name = "ID", length = 50)
private String name;
@CollectionTable(name = "Address", joinColumns = @JoinColumn(name = "ID"),
indexes = @Index(name = "Address_FK_IDX", columnList = "ID"),
foreignKey = @ForeignKey(name = "EMPLOYEE_Address_FK"))
@Column(name = "EXPORT_FORMAT", length = 50)
private List<Address> address;
}
我想创建将包含以下属性的地址实体
String addressLine;
String city;
String pinCode;
List<String> phoneNo;
在这个实体类中,我想将phoneNo的列表存储在另一个收集表中。 我们可以使用@CollectionTable做到这一点吗?还是有其他方法可以做到这一点?
答案 0 :(得分:2)
您可以按照以下步骤进行操作。 CollectionTable
通常用于可嵌入项目而不是实体的集合。您需要阅读其中的区别。尽管有一个很好的案例可以使Address成为可嵌入的对象而不是实体,但这会导致电话号码出现问题,因此我们使用@OneToMany
使Address成为映射到Employee的实体,并在Address中使用ElementCollection
电话号码。
@Entity
@Table(name = "EMPLOYEE")
public class Employee
{
@Id//<-need to specify a generator here
@Column(name = "ID", length = 50)
private String id;
@Column(name = "ID", length = 50)
private String name;
@OneToMany(cascade = CascadeType.ALL)
//define FK column in Address table
@JoinColumn(joinColumns = @JoinColumn(name = "EMPLOYEE_ID"),
foreignKey = @ForeignKey(name = "EMPLOYEE_Address_FK"))
private List<Address> address;
}
地址:
@Entity
@Table("Address")
public class Address {
@Id //<-need to specify a generator here
private Long id;
String addressLine;
String city;
String pinCode;
@ElementCollection
@CollectionTable(name = "Phone", joinColumns = @JoinColumn(name = "ADDRESS_ID"), foreignKey = @ForeignKey(name = "PHONE_Address_FK"))
List<String> phoneNo;
}
如上所述,@CollectionTable
通常与可嵌入对象的集合一起使用,并且有时将Address
设为@Embeddable
而不是@Entity
会导致问题如JPA规范(2.6)所述:
可嵌入类(包括另一个内部的可嵌入类) 必须包含在元素集合中的可嵌入类) 不包含元素集合,也不包含关系 除多对一或一对一关系以外的实体。的 可嵌入类必须在这种关系的拥有方面,并且 该关系必须通过外键映射进行映射。 (请参阅第 2.9。)