@ OneTomany 和@ElementCollection 的区别?

使用 @OneToMany@ElementCollection注释有什么区别,因为它们都处理一对多关系?

118499 次浏览

@ElementCollection标记了一个集合。这并不一定意味着这个集合引用了一个1-n 连接。

我认为 @ElementCollection主要用于映射非实体(可嵌入的或基本的) ,而 @OneToMany用于映射实体。所以选择哪一个取决于你想达到什么样的目标。

@ElementCollection允许您在实现简单或嵌入类型的一对多关系时简化代码。例如,在 JPA 1.0中,当您希望与 String列表建立一对多关系时,您必须创建一个简单的实体 POJO (StringWrapper) ,其中只包含主键和有问题的 String:

@OneToMany
private Collection<StringWrapper> strings;


//...


public class StringWrapper {
@Id
private int id;


private String string;
}

使用 JPA 2.0,你可以简单地写:

@ElementCollection
private Collection<String> strings;

更简单,不是吗? 请注意,您仍然可以使用 @CollectionTable注释控制表名和列名。

参见:

ElementCollection是一个标准的 JPA 注释,它现在比专有的 Hibernate 注释 CollectionOfElements更受欢迎。

这意味着集合不是实体的集合,而是简单类型(String 等)或可嵌入元素(用 @Embeddable注释的类)的集合。

这也意味着元素完全由包含实体所拥有: 它们在实体被修改时被修改,在实体被删除时被删除,等等。它们不能有自己的生命周期。

基本或嵌入 :@ElementCollection
实体 :@OneTomany 或@ManyTomany

@ ElementCollection:

  • 关系(仅)由定义关系的实体管理
  • 表包含对所属实体的 id 引用以及基本属性或嵌入属性

@ OneTomany/@ManyTomany:

  • 也可以由其他实体管理
  • 连接表或列通常只包含 id 引用

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;

@ ElementCollection

当与非实体存在关系且这些关联关系为 时,将应用此注释。每个集合都使用一个表创建,并通过 外键获得关系。

有两种类型的元素集合

  • 索引(列表、地图)
  • 非索引(集合)

Index : 索引类型集合有一个表,其中有3列

  • 键列(外键)
  • 索引列(收集数据的位置)
  • 元素列(数据)

Non-Index : Non-Index 类型集合有一个包含2列的表

  • 键列
  • 元素列

注意 : 这里不会有任何索引列,因为,因为 预备不保留插入顺序。

多样性

这是一种实现两个实体之间 HAS-A 关系的方法,基数比取决于它们之间的关系。