我看到许多使用@Embeddable这样的一对多关系的例子:
@Entity
@Table(name = "profiles")
public class Profile {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@ElementCollection
@CollectionTable(name = "profile_addresses", joinColumns = @JoinColumn(name = "profile_id"))
private List<Address> addresses;
// getters, setters
}
@Embeddable
public class Address {
@Column(name = "zip_code")
private String zipCode;
// other fields
}
它适用于这样的表:
profiles: addresses:
| id | name | | profile_id | zip_code |
| 1 | Alex | | 1 | 95050 |
| 1 | 95109 |
但是如何在embeddable Address实体中使用自己生成的id?例如,在这样的表中:
profiles: addresses:
| id | name | | profile_id | address_id | zip_code |
| 1 | Alex | | 1 | 1 | 95050 |
| 1 | 2 | 95109 |
为Embeddable定义主键时,它不再是Embeddable。 Embeddable由其父实体定义,并且没有自己的身份。这就是为什么Embeddables只能通过它的父实体访问,无论如何也无法解除引用。
见https://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html