【问题标题】:Best Practices for Polymorphic JPA via Annotations通过注解实现多态 JPA 的最佳实践
【发布时间】:2011-03-27 10:48:37
【问题描述】:

我正在尝试使用带有 JPA 注释的 Hibernate 设置多态行为。

创建一个(抽象的)类来封装继承层次结构参与持久性所需的状态和行为似乎是明智的(甚至可能是必要的);例如

  • 我需要注释一个 Id 属性,如果不公开该字段,我无法在接口中执行此操作,以避免在超类上出现“实体上未指定标识符”异常
  • 如果我使用 table-per-class-hierarchy 方法,我需要子类来提供 DiscriminatorValue

以这种方式从与持久性耦合的抽象类继承是好还是坏?有什么优点/缺点?是否有关于在 JPA 中处理继承的最佳实践?

【问题讨论】:

    标签: inheritance jpa annotations polymorphism


    【解决方案1】:

    我不确定您的问题是否有绝对的答案,这实际上取决于您的具体情况以及您希望从 OO 的角度表达的内容。提供一些示例可能会有所帮助。

    但我怀疑您可能想了解映射超类。以下是 JPA 规范的一小部分摘录:

    一个实体可以继承自一个 提供持久性的超类 实体状态和映射信息, 但它本身并不是一个实体。 通常,这样的目的 映射超类是定义状态 和常见的映射信息 到多个实体类。

    映射的超类,与实体不同, 不可查询,不能通过 作为EntityManager 的参数或 Query 操作。一个映射 超类不能是 a 的目标 持久的关系。

    抽象类和具体类都可以 被指定为映射的超类。 MappedSuperclass 注释(或 mapped-superclass XML 描述符 element) 用于指定一个映射的 超类。

    一个类指定为 MappedSuperclass 没有单独的 为它定义的表。它的映射 信息应用于实体 继承自它。

    而且我认为您还应该阅读 JPA 支持的各种继承策略来表示数据库级别的继承(每个类层次结构的单个表、每个具体类的表、连接的子类),因为它们不提供相同的级别对多态查询的支持。 JPA 规范很好地涵盖了这一点。

    以下相关参考资料。

    参考文献

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 1970-01-01
      • 2011-04-06
      • 2019-02-04
      • 1970-01-01
      • 2011-06-25
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多