我们可以在@Entity类中创建@CollectionTable吗,该类在其他@Entity类中用作CollectionTable

时间:2020-02-18 04:41:02

标签: java spring hibernate spring-data-jpa spring-data

我有@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做到这一点吗?还是有其他方法可以做到这一点?

1 个答案:

答案 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。)