【问题标题】:Difference between @OneToMany and @ElementCollection?@OneToMany 和 @ElementCollection 之间的区别?
【发布时间】:2012-02-16 15:36:49
【问题描述】:

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

【问题讨论】:

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

标签: java hibernate jpa


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      @ElementCollection:

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

      @OneToMany / @ManyToMany:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 感谢佩德的回答!你有一个有效的观点,因为 @OneToMany 只能关联实体。
        【解决方案5】:

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

        表示集合不是实体的集合,而是简单类型(Strings等)的集合或可嵌入元素的集合(类用@Embeddable注解)。

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

        【讨论】:

        • ...你不能自己查询它们。
        【解决方案6】:

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

        另见:

        【讨论】:

        • 推理的很好解释。 :)
        【解决方案7】:

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

        【讨论】:

        • 那么@ElementCollection 的目的到底是什么?
        猜你喜欢
        • 2014-11-17
        • 2017-07-05
        • 1970-01-01
        • 2021-12-25
        • 2020-05-10
        • 2014-09-20
        • 2010-10-28
        • 2015-10-04
        • 2012-08-12
        相关资源
        最近更新 更多