Можем ли мы создать @CollectionTable внутри класса @Entity, который используется как CollectionTable в каком-то другом классе @Entity - PullRequest
1 голос
/ 18 февраля 2020

У меня @Entity class как

@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;

}

Я хочу создать объект Address, который будет содержать атрибуты ниже

String addressLine; 
String city;
String pinCode;
List<String> phoneNo;

В этом классе объектов я хочу сохранить список phoneNo внутри другой коллекционный стол. Можем ли мы сделать это с помощью @CollectionTable или есть другой способ сделать это?

1 Ответ

2 голосов
/ 18 февраля 2020

Вы можете сделать это, как показано ниже. CollectionTable обычно используется для коллекций встраиваемых элементов, а не объектов. Вам нужно будет прочитать разницу. Несмотря на то, что есть хороший случай сделать Address встраиваемым здесь, а не сущностью, это может вызвать проблемы с телефонными номерами, поэтому мы делаем Address сущностью, сопоставленной с Employee, используя @OneToMany и используем ElementCollection в Address для телефонных номеров.

@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 spe c (2.6):

Встраиваемый класс (включая встраиваемый класс в другом встраиваемом классе), который содержится в коллекции элементов, должен не содержит коллекцию элементов и не может содержать отношения к объекту, отличные от отношения «многие к одному» или «один к одному». Встраиваемый класс должен находиться на стороне-владельце такого отношения, и отношение должно отображаться сопоставлением внешнего ключа. (См. Раздел 2.9.)

...