Вы можете сделать это, как показано ниже. 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.)