我有一个带有可嵌入地址的Person实体,并且它们之间存在一对多关系(一个人可以有多个地址)。当前的映射是这样的:

@Embeddable
public class Address {
    // ... attributes
}

@Entity
public class Person {
    @ElementCollection(fetch = FetchType.EAGER)
    @JoinTable(name = "Person_addresses", joinColumns = @JoinColumn(name = "personid")
    )
    /*
    Attribute ovverrides with annotations
    */
    private java.util.Set<Address> addresses = new java.util.HashSet<Address>();
}

使用此注释意味着在数据库中我有一个Person_addresses表,其中包含所有地址属性和一个personid。但这也意味着,如果我有一个拥有地址列表的人并更新地址列表,Hibernate将删除所有相关记录,然后再次插入它们(修改后的记录)。

据我所知,有一种方法可以在此表中为每条记录提供主键-在这种情况下,hibernate可以决定需要更新列表中的哪一项。所以我的问题是,如何在联接表中映射带有标识符的可嵌入列表? (我希望这是可以理解的)。

最佳答案

http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection#Primary_keys_in_CollectionTable

JPA 2.0规范没有提供定义ID的方法
可嵌入的。但是,要删除或更新
ElementCollection映射,通常需要一些唯一的键。
否则,在每次更新时,JPA提供程序都需要删除
实体的CollectionTable中的所有内容,然后插入
值返回。因此,JPA提供者很可能会假设
可嵌入对象中所有字段的组合都是唯一的
与外键(JoinColumn(s))组合。但是这可能
效率低下,或者如果Embeddable很大,就是不可行,或者
复杂。一些JPA提供程序可能允许在ID中指定ID
可嵌入,以解决此问题。请注意,在这种情况下,ID仅需要
对于集合(而不是表)来说是唯一的,因为外键是
包括在内。有些可能还允许CollectionTable上的唯一选项
用于此。否则,如果您的可嵌入对象很复杂,则可以
考虑将其设为实体,并改用OneToMany。

就是这样,这是不可能完成的。

08-04 16:02