@OneToMany和@ElementCollection之间的区别?

时间:2012-01-23 08:53:43

标签: java hibernate jpa

使用@OneToMany@ElementCollection注释之间的区别是什么,因为它们都与一对多关系有关?

7 个答案:

答案 0 :(得分:137)

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

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

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

答案 1 :(得分:92)

我认为@ElementCollection主要用于映射非实体(可嵌入或基本),而@OneToMany用于映射实体。那么使用哪一个取决于你想要实现的目标。

答案 2 :(得分:52)

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

String

使用JPA 2.0,您只需编写:

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

更简单,不是吗?请注意,您仍然可以使用@ElementCollection private Collection<String> strings; 注释来控制表名和列名。

另见:

答案 3 :(得分:2)

基本或嵌入式:@ElementCollection
实体:@ OneToMany或@ManyToMany

@ElementCollection:

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

@OneToMany / @ManyToMany:

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

ElementCollection可以覆盖映射或它们的集合的表,因此您可以让多个实体引用同一个Embeddable类,但每个实体都将其依赖对象存储在单独的表中。

答案 6 :(得分:0)

您可以使用 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;