【问题标题】:JPA: When to choose Multivalued Association vs. Element Collection MappingJPA:何时选择多值关联与元素集合映射
【发布时间】:2011-03-26 00:34:51
【问题描述】:

我想更好地了解它们之间的区别

(1) 传统的多值关系/关联

   @Entity -> @OneToMany -> @Entity

(2) JPA2 可嵌入(和基本)类型的集合

  @Entity -> @ElementCollection -> @Embeddable

我看到了语法差异,但想知道是否也存在性能影响。在幕后,数据库实现看起来非常相似。

直观地说,我通常会将@ElementCollection 用于构图场景。但即使这样感觉也很像CascadeType=DELETE

我错过了这里的本质吗?对于某些目的,一种比另一种更有效吗?

谢谢你,J。

【问题讨论】:

    标签: java hibernate orm jpa jpa-2.0


    【解决方案1】:

    JPA 规范明确

    Embeddables 不能独立于其父对象进行查询、持久化、合并。 它们是严格私有(依赖)的对象

    您应该谨慎使用,因为它的生命周期受拥有实体实例的生命周期的限制。因此,如果您持久/合并/删除您拥有的实体实例,它的所有可嵌入对象实例都将被持久化/合并/删除

    假设你做了类似的事情

    /**
      * Let's suppose owning contains SIX embeddables instances
      */
    Owning owning = manager.find(Owining.class, owningId);
    

    所以您在视图层修改只是您的拥有实体并提交您的更改。您使用

    检索您的拥有实体
    /**
      * Usually your web framework Takes care of binding your submitted data
      */
    Owning owning = new Owning();
    owning.setProperty(request.getParameter("property"));
    

    然后您可以合并您提交的数据,并且您认为您的可嵌入实例存储在数据库中。好吧,让我们看看

    如上所示您(或您的 Web 框架)刚刚检索到 Owning 属性,对吗?所以你的 owning.getElementList() 是空的。因为 owning.getElementList() 是空的,JPA 将删除它的所有可嵌入实例。请记住这一点。

    通常一个可嵌入的类除了它的拥有实体之外没有任何关系。并且当使用一组可嵌入对象时,JPA 总是在保存/更新之前选择,因为它需要使用其 equals 方法逐一比较。因此,在使用 Set 集合时,您需要一个一致的 equals 实现

    Here 你可以在 Hibernate 中看到它的对应物。

    【讨论】:

    【解决方案2】:

    直观地说,我通常会将@ElementCollection 用于组合场景。但即使这样感觉也很像 CascadeType=DELETE

    它们很相似,但有一些细微的差别。 Java Persistence wikibook 中的 ElementCollection 页面很好地总结了它:

    Emdedded Collections

    ElementCollection 映射可以是 用于定义一个集合 Embeddable 对象。这不是一个 Embeddable 对象的典型用法为 对象未嵌入 源对象的表,但存储在 单独的收集表。这是 类似于OneToMany,除了 目标对象是Embeddable Entity。这允许集合 简单的对象很容易 已定义,无需简单 对象来定义 IdManyToOne 逆映射。 ElementCollection可以 还覆盖映射或表 为他们的收藏,所以你可以拥有 多个实体引用相同的 Embeddable类,但每个商店都有 它们的依赖对象在一个单独的 表。

    使用的限制 ElementCollection 而不是 OneToMany 是目标对象 无法查询、持久化、合并 独立于它们的父对象。 他们是严格私有的 (从属)对象,与 Embedded 映射。他们不是cascade ElementCollection 上的选项, 目标对象始终保持不变, 与父级合并,删除。 ElementCollection 还可以用 获取类型,默认为LAZY 与其他集合映射相同。

    另见

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多