JPA 2.0:一个实体独有的嵌入式对象

时间:2012-04-11 15:02:09

标签: java jpa jpa-2.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对象,然后保持并读取它们,它们将再次共享具有相同标识的对象。我想禁止保存与其他客户共享地址的客户。

2 个答案:

答案 0 :(得分:1)

在这种情况下,最简单的方法是在Address中创建Customer.setAddress()对象的副本。

此外,我不确定从数据库中检索时,不同的Customer可以共享具有相同标识的Address。也许您从会话缓存中获取相同的对象,因为您在同一会话中保存并读取它们。

答案 1 :(得分:1)

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

JPA规范在第2.5节中介绍了有关嵌入对象的内容:

  

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

如果您的JPA实施并不遵守,那么它并不符合JPA标准...