使用 @OneToMany和 @ElementCollection注释有什么区别,因为它们都处理一对多关系?
@OneToMany
@ElementCollection
@ElementCollection标记了一个集合。这并不一定意味着这个集合引用了一个1-n 连接。
我认为 @ElementCollection主要用于映射非实体(可嵌入的或基本的) ,而 @OneToMany用于映射实体。所以选择哪一个取决于你想达到什么样的目标。
@ElementCollection允许您在实现简单或嵌入类型的一对多关系时简化代码。例如,在 JPA 1.0中,当您希望与 String列表建立一对多关系时,您必须创建一个简单的实体 POJO (StringWrapper) ,其中只包含主键和有问题的 String:
String
StringWrapper
@OneToMany private Collection<StringWrapper> strings; //... public class StringWrapper { @Id private int id; private String string; }
使用 JPA 2.0,你可以简单地写:
@ElementCollection private Collection<String> strings;
更简单,不是吗? 请注意,您仍然可以使用 @CollectionTable注释控制表名和列名。
@CollectionTable
ElementCollection是一个标准的 JPA 注释,它现在比专有的 Hibernate 注释 CollectionOfElements更受欢迎。
ElementCollection
CollectionOfElements
这意味着集合不是实体的集合,而是简单类型(String 等)或可嵌入元素(用 @Embeddable注释的类)的集合。
@Embeddable
这也意味着元素完全由包含实体所拥有: 它们在实体被修改时被修改,在实体被删除时被删除,等等。它们不能有自己的生命周期。
基本或嵌入 :@ElementCollection 实体 :@OneTomany 或@ManyTomany
@ ElementCollection:
@ OneTomany/@ManyTomany:
ElementCollection 可以覆盖映射或其集合的表,因此可以让多个实体引用相同的 Embeddable 类,但是让每个实体将其相关对象存储在单独的表中。
您可以使用 ElementCollection 替换使用@OneTomany。例如,您可以有多个版本的一个项目。
@ElementCollection @CollectionTable(name="versions", joinColumns = @JoinColumn(name="projectID")) @LazyCollection(LazyCollectionOption.FALSE) @JoinColumn(name="version",nullable = false) private Set<String> versions;
还可以使用@ElementCollection 在一个集合中映射数组的 OGM。
@ElementCollection(fetch = FetchType.EAGER) private Set<String> researchAreas;
当与非实体存在关系且这些关联关系为 有时,将应用此注释。每个集合都使用一个表创建,并通过 外键获得关系。
有两种类型的元素集合
Index : 索引类型集合有一个表,其中有3列
Non-Index : Non-Index 类型集合有一个包含2列的表
注意 : 这里不会有任何索引列,因为,因为 预备不保留插入顺序。