@MappedSuperclass不是JPA中的@Entity?

时间:2016-05-02 20:37:02

标签: java hibernate jpa inheritance orm

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

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

有解决方法吗?

3 个答案:

答案 0 :(得分:3)

正如我在this article中所解释的那样,@MappedSupperclass@Inheritance注释不同。

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

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

@Inheritance注释旨在实现数据库表结构中的OOP继承模型。此外,您可以查询使用@Inheritance注释的基类,但不能对使用@MappedSuperclass注释的基类执行此操作。

答案 1 :(得分:2)

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

更改继承

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

- > Superclass-Types

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

附加:

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

更改模型(建议)

不要仅根据角色将您的用户实体拆分为多个实体。制作一个包含所有所需角色的Enum,并将其作为字段添加到User - 实体。这种情况更为常见,除非你需要你的管理员,客人等作为自己的对象......

答案 2 :(得分:0)

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