@MappedSuperclass不是@entity?

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

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

有解决方法吗?

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

改变inheritance

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

– > 超类 – 类型

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

额外:

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

改变模型(建议)

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

正如我在本文中解释的那样, @MappedSupperclass@Inheritance注释不同。

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

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

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