0

JPA 2.0 中是否有可能确保嵌入对象仅嵌入一个对象,而不是多个对象?

就我而言Address,我有一个可以分配给Customer. 我希望每个客户都使用自己的地址对象,并希望创建一个约束来确保没有两个客户共享实际相同的对象。

我的代码如下所示:

@Entity
public Customer {
    @Id
    @GeneratedValue
    private Long id;

    @Embedded
    private Address address;

    // ..   
}

@Embeddable
public Address {
    private String street;
    private String city;

    // ..
}

目前,如果我创建两个客户并为他们分配相同的Address对象,然后持久化并读取它们,他们再次以相同的身份共享对象。我想禁止保存与其他客户共享地址的此类客户。

4

2 回答 2

1

在这种情况下,最简单的方法是AddressCustomer.setAddress().

另外,我不确定从数据库中检索时不同Customer的 s 是否可以共享Address相同的身份。也许您从会话缓存中获得了相同的对象,因为您在同一个会话中保存和读取它们。

于 2012-04-11T15:09:36.620 回答
1

@Embedded 机制的本质是嵌入类的嵌入实例永远不会在封闭类的不同实例之间共享。如果您在代码中观察到此行为,那一定是因为您在从实体管理器读取期间访问了缓存数据。因此,即使您将可嵌入类的同一实例分配给封闭类的多个实例,然后“persist()”,然后销毁实体管理器和 EntityManagerFactories,或使缓存“entityManager.getEntityManagerFactory().getCache() .evictAll()”,然后创建一个新的 EntityManager 和“find()”封闭对象,即使它们的内容相同,它们中的每一个都应该有自己的(在你的情况下)“地址”对象的实例。

JPA 规范在第 2.5 节中对嵌入式对象进行了以下说明:

[...] 与实体实例不同,这些类的实例没有自己的持久标识。相反,它们仅作为它们所属实体的状态的一部分而存在。[...]

如果您的 JPA 实现不遵守这一点,那么它实际上并不符合 JPA 标准......

于 2015-05-21T14:19:01.733 回答