@MappedSuperclass不是@entity?
所以我正在使用DerbyDB,我正在设置一些实体。 我有一个@MappedSuperclass
,它被用作某些实体的超类( @Entity
)。 更具体地说,我有一个超类User
和3个子类,即admin
, regular
和guest
。 现在我有一个不同的实体,让我们说应该引用(作为其中一个字段)其所有者的文件。 所以我创建了一个名为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
。
- 与hibernate的父/子关系出现问题
- Spring,MySQL和Hibernate:如果系统在8小时内未使用,则会出现数据库错误
- 错误:未找到实体类:
- 命名查询的等效条件查询
- java.lang.ClassNotFoundException:org.apache.log4j.Level
- org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行,但它确实存在
- 一个行为类似于@Entity和@Embeddable的类
- 在Spring 3之前注入Hibernate会话的最佳方法
- struts2 + hibernate3 + jasper-report 5.0 —得到空白报告