代码之家  ›  专栏  ›  技术社区  ›  Rakim Brigham

@MappedSuperclass不是JPA中的@Entity?

  •  9
  • Rakim Brigham  · 技术社区  · 8 年前

    因此,我正在使用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].
    

    有解决办法吗?

    3 回复  |  直到 6 年前
        1
  •  20
  •   Vlad Mihalcea    4 年前

    @MappedSupperclass 不同于 @Inheritance 注释。

    @MappedSuperclass 告诉JPA提供者包含基类持久属性,就像它们是由扩展用注释的超类的子类声明的一样 @映射超类 .

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

    这个 @继承 注释的目的是在数据库表结构中具体化OOP继承模型。此外,您可以查询用注释的基类 @继承 但对于用注释的基类,不能这样做 @MappedSuperclass .

        2
  •  7
  •   Community CDub    4 年前

    我可以建议两种解决方案:

    更改继承

    您得到的异常清楚地描述了您的问题: User 不是实体。用接口声明为超类的任何类 @MappedSuperclass 不能是实体 (在标准JPA中-取决于您的JPA提供商) …让我给你指出一个我刚刚对一个相当类似的问题给出的答案

    --> Superclass-Types

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

    额外:

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

    更改模型(建议)

    不要仅仅根据角色将用户实体划分为多个实体。制作一个 Enum 并将其作为字段添加到您的 使用者 -实体。这是更常见的,除非你需要你的管理员,客人等成为自己的对象。。。

        3
  •  1
  •   Md. Samim hossain    4 年前

    有时为了继承子类,我们创建了一个父类,但我们不将其用作表。继承这个父类,我们创建了不同的表。这就是为什么我们在父类中不使用@Entity。而不是在父类或超类中使用@MappedSuperClass。