首页 > 解决方案 > @Embeddable 有自己的 id

问题描述

我看到许多使用@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  |

但是如何在可嵌入地址实体中使用它自己的自动生成的 id?例如,在这样的表格中:

  profiles:                   addresses:
| id | name |         | profile_id | address_id | zip_code  |
| 1  | Alex |         |     1      |      1     |   95050   |
                      |     1      |      2     |   95109   |

标签: javajpa

解决方案


当您为 Embeddable 定义主键时,它不再是 Embeddable。Embeddable 由它的父实体定义,并且没有自己的身份。这就是为什么 Embeddables 只能通过它的父实体访问并且无论如何都不能被取消引用的原因。

请参阅https://docs.oracle.com/javaee/6/api/javax/persistence/Embeddable.html


推荐阅读