ChatGPT解决这个技术问题 Extra ChatGPT

@OneToMany 和 @ElementCollection 之间的区别?

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

简而言之,@ElementCollection 用于当没有父实体 IOW 的子实体的存在毫无意义时,每当删除父实体时,您的孩子也将...
我相信它不是子实体,它是嵌入的值类型/值对象,如果没有包含它的主实体,它的存在意义不大。
同意@CuriousMind,在 JPA 中,“实体”有自己的生命周期。

S
Sanghyun Lee

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

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

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


...而且您无法自行查询它们。
n
naXa stands with Ukraine

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


感谢佩德的回答!因为 @OneToMany 只能关联实体,所以你有一个有效的观点。
T
Tomasz Nurkiewicz

@ElementCollection 允许您在希望使用简单类型或嵌入类型实现一对多关系时简化代码。例如,在 JPA 1.0 中,当您想要与 String 列表建立一对多关系时,您必须创建一个仅包含主键和相关 String 的简单实体 POJO (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 注释来控制表名和列名。

也可以看看:

Java 持久性/元素集合


推理的很好的解释。 :)
f
fidudidu

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

@ElementCollection:

关系由定义关系的实体(仅)管理

表包含对拥有实体的 id 引用以及基本或嵌入式属性

@OneToMany / @ManyToMany:

也可以由其他实体管理

连接表或列通常仅包含 id 引用


c
chzbrgla

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


那么@ElementCollection 的目的到底是什么?
f
farshad-nsh

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


u
user18136172

@ElementCollection

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

有两种类型的元素集合

索引(列表、地图)

非索引(集)

索引:索引类型集合有一个包含 3 列的表,它们是

键列(外键)

索引列(集合中数据的位置)

元素列(数据)

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

关键列

元素栏

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

多样性


P
PhongPhamIUH

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