@MappedSuperclass 不是 JPA 中的 @Entity 吗?

Rak*_*kim 7 java orm inheritance hibernate jpa

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

Exception Description: [File] uses a non-entity [User] as target entity in the relationship attribute [field owner].
Run Code Online (Sandbox Code Playgroud)

有解决方法吗?

Vla*_*cea 12

@MappedSupperclass@Inheritance注解不同。

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

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

@Inheritance注释是为了兑现在数据库表结构的OOP继承模型。此外,您可以查询用 注释的基类,@Inheritance但不能查询用 注释的基类@MappedSuperclass


XiC*_*JFS 6

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

改变继承

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

-->超类类型

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

额外的:

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

更改模型(建议)

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