因此,我正在使用DerbyDB,并且正在设置一些实体。我有一个@MappedSuperclass用作某些实体(@Entity)的超类。更具体地讲,我有一个超类User和子类3,即admin,regular和guest。现在,我有一个不同的实体,假设file该实体应引用其所有者(作为其字段之一)。因此,我创建了一个名为的字段User owner。我得到的错误是:
@MappedSuperclass
@Entity
User
admin
regular
guest
file
User owner
Exception Description: [File] uses a non-entity [User] as target entity in the relationship attribute [field owner].
有解决方法吗?
我可以提出两种解决方案:
您得到的异常清楚地描述了您的问题:User不是实体。使用接口声明为超类的任何类@MappedSuperclass都不能是实体 (在标准JPA中-取决于您的JPA提供者) …让我为您指出我刚刚对一个类似问题的回答
因此,您描述了将超类定义为抽象实体将为您提供所需的行为。
如果您选择继承映射策略,因为@Inheritance(strategy = InheritanceType.SINGLE_TABLE)您甚至不需要多个数据库表。这是一个很好的示例:JPA单表继承
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
不要仅将用户实体划分为几个角色。将Enum所有所需的角色设为,并将其作为字段添加到您的User实体中。除非您需要您的管理员,来宾等成为自己的对象,否则这是更普遍的情况。
Enum