【问题标题】:@MappedSuperclass is not an @Entity in JPA?@MappedSuperclass 不是 JPA 中的 @Entity?
【发布时间】:2016-08-27 17:41:51
【问题描述】:

所以我正在使用 DerbyDB 并且正在设置一些实体。我有一个@MappedSuperclass,它被用作某些实体的超类(@Entity)。更具体地说,我有一个超类 User 和 3 个子类,即 admin、regular 和 guest。现在我有一个不同的实体,比如说file,它应该引用(作为它的字段之一)它的所有者。所以我创建了一个名为User owner 的字段。 我得到的错误是:

Exception Description: [File] uses a non-entity [User] as target entity in the relationship attribute [field owner].

有解决办法吗?

【问题讨论】:

  • 您的错误显然特定于您使用的任何 JPA 实现(并且您没有告诉我们是哪一个)。我的 JPA 提供程序允许在关系中使用 MappedSuperclass。
  • @NeilStockton,哪个 JPA-provider 允许使用 MappedSuperclass 作为实体?从 oracle 文档开始:“映射的超类不能被查询,也不能在 EntityManager 或 Query 操作中使用。”
  • DataNucleus JPA 执行 IIRC,任何 JPA 供应商都可以为(有限的)JPA 规范提供自己的扩展(就像其他领域的其他人一样)。
  • @NeilStockton thx 获取信息,到目前为止,我只使用 EclipseLink 和 Hibernate,它们不允许 MappedSuperclass 成为实体

标签: java hibernate jpa inheritance orm


【解决方案1】:

@MappedSupperclass 不同于 @Inheritance 注释。

@MappedSuperclass 告诉 JPA 提供程序包含基类持久属性,就好像它们是由扩展带有 @MappedSuperclass 注释的超类的子类声明的一样。

但是,继承仅在 OOP 世界中可见,因为从数据库的角度来看,没有基类的指示。只有子类实体会有关联的映射表。

@Inheritance 注解旨在实现数据库表结构中的 OOP 继承模型。此外,您可以查询带有@Inheritance 注释的基类,但您不能查询带有@MappedSuperclass 注释的基类。

【讨论】:

    【解决方案2】:

    我可以提出两种解决方案:

    更改继承

    您得到的异常清楚地描述了您的问题:User 不是实体。任何声明为具有接口 @MappedSuperclass 的超类的类都不能是实体(在标准 JPA 中 - 取决于您的 JPA 提供者)...让我指出我刚刚给出的答案类似的问题

    --> Superclass-Types

    因此,将您的超类定义为抽象实体将为您提供所需的行为,正如您所描述的。

    额外:

    如果您将继承映射策略选择为@Inheritance(strategy = InheritanceType.SINGLE_TABLE),您甚至不需要多个数据库表。这是一个很好的例子:JPA Single-Table Inheritance

    更改模型(建议)

    不要仅根据角色将用户实体拆分为多个实体。使用您想要的所有角色创建一个Enum,并将其作为字段添加到您的User-entity。这更普遍,除非您需要您的管理员、客人等成为自己的对象...

    【讨论】:

    • 我想过,但不能真正改变模型,因为每个用户都有自己的属性。只有少数基本内容适用于所有用户类型
    • 好的,我明白了。如果有很多不同的额外属性,我建议使用 InheritanceType.JOINED。 SINGLE_TABLE 否则会导致大量冗余数据(空列)...快乐编码=)
    【解决方案3】:

    有时为了继承子类我们创建一个父类但我们不将它用作表。继承该父类我们创建各种表。这就是我们不在父类中使用@Entity的原因。而不是我们在父类或超类中使用@MappedSuperClass。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 2014-05-30
      • 1970-01-01
      • 2020-12-04
      • 2018-03-11
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多