所以我正在使用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].
有解决方法吗?
答案 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。