【问题标题】:Strategy for writing to parent entity as well when storing child entities on a JPA schema with TABLE_PER_CLASS inheritance strategy使用 TABLE_PER_CLASS 继承策略在 JPA 模式上存储子实体时写入父实体的策略
【发布时间】:2016-09-26 14:33:42
【问题描述】:
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

在父类中允许将子实体视为具有与父类相同的信息以及一些属性的表。阅读时对我来说很好 (http://viralpatel.net/blogs/hibernate-inheritance-table-per-concrete-class-annotation-xml-mapping/)。

但如果我存储子实体(目前它只填充子表),我希望这样,父表也会随着共享部分的插入而更新。

这是否可以配置,或者我是否需要在任何给定的写操作的事务中显式执行childRepo.save(child) 加上parentRepo.save(child)

这在某种程度上是 TABLE_PER_CLASS 和 JOINED 策略的混合。 JOINED 将共享信息存储在父级中,而额外的属性存储在子级中;而 TABLE_PER_CLASS 将所有内容存储在子项中。我想要包含所有信息的子表,而父表也可以同步所有共享信息。

【问题讨论】:

  • 什么是childRepo
  • 什么是“存储库”?如果您指的是 Spring Data 存储库,那么这是您需要在问题中包含的主要组件。而且您永远不必将子类强制转换为其超类,以便将其传递给接受超类的方法。
  • 1.是的,抱歉,Spring Data 的 JPA 存储库。 2.这就是为什么我讨厌这种解决方法,我正在尝试找到一个更简洁的解决方案
  • 你有没有试过写animalRepo.save(dog)?我用过没问题。
  • 啊抱歉,现在我明白了。我的错。愚蠢的错误,忘记它:p

标签: java hibernate jpa persistence


【解决方案1】:

有 3 种继承策略:SINGLE_TABLE、JOINED 和 TABLE_PER_CLASS。 -TABLE_PER_CLASS :将每个实体映射到一个表 -SINGLE_TABLE :父实体和子实体将仅映射到一张表(在 DB 中,整个继承层次结构只有一张表)。 -JOINED : 这是你需要的,共享属性会被持久化在父表中,子相关属性会被持久化在子表中

【讨论】:

  • 这些是 JPA 定义的策略,对于您需要自己实现的任何其他需要的行为,您可以使用 SINGLE_Table + parentRepo.save((Parent) child)
  • JOINED 缺少我的需求之一,即在子表上存储子实体的继承属性
  • 我的意思是它最接近您的需求,如果您想坚持 JPA 定义的策略,否则您需要添加一些植入来满足您的需求。您提到的解决方案很好,您还可以使用 DB 触发器或 JPA 侦听器(创建子实体的侦听器,它将在父实体中执行持久化)
【解决方案2】:

添加到 3 种继承策略中:SINGLE_TABLE、TABLE_PER_CLASS 和 JOINED。 谈到插入,table_per_class 在同一张表上有单独的插入查询,但鉴别器值不同。对于每个备用列,表也将具有空值,已设置鉴别器。选择也将是分开的。如果使用联合子类,则使用联合的单个选择查询。 在联接策略中,父表和子表各插入两个。选择是通过父表左外连接与子表完成的。

所以如果你想使用 table_per_class,你可以使用每个子类的联合,生成器类作为分配,多态性值作为隐式或连接子类。

【讨论】:

    猜你喜欢
    • 2021-02-21
    • 1970-01-01
    • 2022-10-25
    • 2019-12-22
    • 2016-11-03
    • 1970-01-01
    • 2018-07-02
    • 2019-01-06
    • 2010-10-29
    相关资源
    最近更新 更多