java - JPA:实现模型层次结构 - @MappedSuperclass 与 @Inheritance

标签 java hibernate jpa inheritance orm

我正在将 Play Framework 1.2.4 与 PostgreSQLJPA 结合使用。我想要一个模型层次结构,并看到有一些替代方法可以做到这一点。

我有一个基类(抽象的)和两个扩展该基类的具体类。当我想要有具体的类时,我不想保留这个基类。在基类中,我有另一个 Model 类作为属性,换句话说,我的基类中有 @ManyToOne 关系。

我的问题是实现此目的的最佳方法是什么?使用 @MappedSuperclass@InheritanceTABLE_PER_CLASS 策略?我有点困惑,因为它们看起来实际上是等价的。

我还对将来可能遇到的查询和性能问题感到担忧。

最佳答案

MappedSuperClass 必须用于继承属性、关联和方法。

当您拥有一个实体和多个子实体时,必须使用实体继承。

您可以通过回答以下问题来判断是否需要其中一个:模型中是否存在可能与基类关联的其他实体?

如果是,那么基类实际上是一个实体,您应该使用实体继承。如果不是,那么基类实际上是一个包含几个不相关实体所共有的属性和方法的类,您应该使用映射的父类(super class)。

例如:

  • 您可以有多种消息:短信、电子邮件或电话消息。一个人有一个消息列表。您还可以将提醒链接到消息,无论消息的类型如何。这种情况下,Message显然是一个实体,必须使用实体继承。
  • 所有域对象都可以有创建日期、修改日期和 ID,因此您可以使它们继承自 AbstractDomainObject 基类。但任何实体都不会与 AbstractDomainObject 建立关联。它始终是与更具体的实体的关联:客户、公司等等。在这种情况下,使用 MappedSuperClass 是有意义的。

关于java - JPA:实现模型层次结构 - @MappedSuperclass 与 @Inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58321177/

相关文章:

java - Hibernate 的 load() 方法对不存在的 ID 做了什么?

java - JPA持久化继承

jpa - Hibernate Envers 无法删除实体

java - 在数据库更新时使用 Spring 和 Hibernate 更新单例对象

java - hibernate 和Java

Spring + JPA + hibernate

java - ThreadPoolExecutor中如何在线程间分配任务

java - 使用 Struts 2 提供静态文件 (JavaScript)

java.lang.ClassNotFoundException : SavingAccount 异常

java - Spring JPA OneToOne FK 作为 PK Cascade.Remove