Java @OneToMany和@ElementCollection之间的区别?

Java @OneToMany和@ElementCollection之间的区别?,java,hibernate,jpa,Java,Hibernate,Jpa,使用@OneToMany和@ElementCollection注释有什么区别,因为两者都适用于一对多关系?@ElementCollection标记一个集合。这并不一定意味着此集合引用1-n联接。我认为@ElementCollection主要用于映射非实体(可嵌入或基本),而@OneToMany用于映射实体。因此,使用哪一种取决于您想要实现的目标 @ElementCollection允许您在使用简单或嵌入式类型实现一对多关系时简化代码。例如,在JPA 1.0中,当您想要与字符串列表建立一对多关系时

使用
@OneToMany
@ElementCollection
注释有什么区别,因为两者都适用于一对多关系?

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

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

@ElementCollection
允许您在使用简单或嵌入式类型实现一对多关系时简化代码。例如,在JPA 1.0中,当您想要与
字符串
列表建立一对多关系时,您必须创建一个简单的实体POJO(
StringWrapper
),其中只包含主键和相关的
字符串

@OneToMany
private Collection<StringWrapper> strings;

//...

public class StringWrapper {
  @Id
  private int id;

  private String string;
}
@OneToMany
私人收藏字符串;
//...
公共类StringWrapper{
@身份证
私有int-id;
私有字符串;
}
使用JPA 2.0,您只需编写:

@ElementCollection
private Collection<String> strings;
@ElementCollection
私人收藏字符串;
更简单,不是吗?请注意,您仍然可以使用
@CollectionTable
注释来控制表名和列名

另见:

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

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


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

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

@元素集合:

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

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

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

您可以使用ElementCollection替换@OneToMany。例如,您可以在多个版本中拥有一个项目

@ElementCollection
@CollectionTable(name="versions",
joinColumns = @JoinColumn(name="projectID"))
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name="version",nullable = false)
private Set<String> versions;
@ElementCollection
@CollectionTable(name=“versions”,
joinColumns=@JoinColumn(name=“projectID”))
@LazyCollection(LazyCollectionOption.FALSE)
@JoinColumn(name=“version”,nullable=false)
专用集版本;
您还可以在一个集合中为数组映射OGM时使用@ElementCollection

@ElementCollection(fetch = FetchType.EAGER)
private Set<String> researchAreas;
@ElementCollection(fetch=FetchType.EAGER)
私人研究领域;

那么@ElementCollection的目的到底是什么呢?谢谢Peder的回答!你的观点是正确的,因为@OneToMany只能关联实体。很好地解释了原因。:)简言之,@ElementCollection是在没有父实体的情况下,子实体的存在毫无意义时使用的,如果父实体被移除,那么您的子实体也将…我相信它不是子实体,它是嵌入的值类型/值对象,如果没有包含它的主要实体,它的存在就没有意义。同意@CuriousMind,在JPA中,“实体”有自己的生命周期。。。。你不能单独查询它们。