我正在尝试使用带有JPA注释的Hibernate设置多态行为。
创建一个(抽象)类来封装继承层次结构参与持久性所需的状态和行为似乎是明智的(甚至可能是必要的);例如
从一个抽象类继承加上持久性这种方式是一种好的还是坏的做法?有哪些优点/缺点?是否有关于在JPA中处理继承的最佳实践?
答案 0 :(得分:7)
我不确定你的问题是否有绝对的答案,这实际上取决于你的特定情况以及你想从OO的角度来表达什么。提供一些例子可能有所帮助。
但我怀疑你可能想了解 Mapped Superclasses 。以下是JPA规范的一些摘录:
实体可以从a继承 提供持久性的超类 实体状态和映射信息, 但这本身并不是一个实体。 通常,这样的目的 映射的超类是定义状态 和映射常见的信息 到多个实体类。
映射的超类,与实体不同, 不可查询,无法传递 作为
EntityManager
或{。}的论据Query
次操作。映射 超类不能成为一个目标 持久的关系。抽象和具体课程都可以 被指定为映射的超类。
MappedSuperclass
注释(或mapped-superclass
XML描述符 element)用于指定映射 超类。指定为的班级
MappedSuperclass
没有单独的 为它定义的表。它的映射 信息应用于实体 继承自它。
我认为您还应该阅读各种继承策略来表示JPA支持的数据库级别的继承(每个类层次结构的单个表,每个具体类的表,连接的子类),因为它们不提供相同的级别支持多态查询。 JPA规范很好地涵盖了这一点。
以下相关参考文献。