@OneToMany和@ElementCollection之间的区别?


128

由于使用a @OneToMany@ElementCollection批注之间都存在一对多关系,因此两者之间有什么区别?


3
简而言之,如果没有父实体IOW而子实体的存在毫无意义,则使用@ElementCollection,每当删除父实体时,您的子代也将...
dellasavia 2015年

1
我相信不是子实体,而是嵌入的值类型/值对象,如果没有包含它的主要实体,其存在意义就更小了。
CuriousMind

同意@CuriousMind,在JPA中,“实体”具有其自己的生命周期。
mhrsalehi

Answers:


124

我相信@ElementCollection主要用于映射非实体(可嵌入或基本),而@OneToMany用于映射实体。因此,使用哪种取决于您要实现的目标。


1
感谢Peder的回答!您在这里有一个有效的观点,因为@OneToMany仅可以关联实体。
n_g 2012年

157

ElementCollection是标准的JPA批注,现在比专有的Hibernate批注首选CollectionOfElements

这意味着该集合不是实体的集合,而是简单类型(字符串等)的集合或可嵌入元素的集合(带有标记的类@Embeddable)。

这也意味着元素完全由包含实体拥有:在修改实体时会对其进行修改,在删除​​实体时会对其进行删除,等等。它们无法拥有自己的生命周期。


...,您无法自行查询。
卡在

65

@ElementCollection当您要使用简单或嵌入式类型实现一对多关系时,可以简化代码。例如,在JPA 1.0中,当您希望与Strings 列表具有一对多关系时,您必须创建一个StringWrapper仅包含主键和相关String问题的简单实体POJO():

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}

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

@ElementCollection
private Collection<String> strings;

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

也可以看看:


合理的解释。:)
Phuah Yee Keat

4

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

@ElementCollection:

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

@OneToMany / @ManyToMany:

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

1

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


1
那么@ElementCollection的目的到底是什么?
n_g 2012年

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.