当前位置: 首页 > 知识库问答 >
问题:

在JPA中,@mappdSuperclass不是一个@实体?

洪宇定
2023-03-14

所以我在使用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].

有变通办法吗?

共有3个答案

安经纶
2023-03-14

有时为了继承子类,我们会创建一个父类,但不将其用作表。继承父类,我们创建各种表。这就是为什么我们在父类中不使用@Entity。而不是我们在父类或超级类中使用@MappdSuperClass。

洪弘壮
2023-03-14

我可以提出两种解决方案:

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

--

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

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

不要仅仅按角色将用户实体拆分为多个实体。创建一个包含所有所需角色的枚举,并将其作为字段添加到用户-实体中。这是更普遍的,除非你需要你的管理员,客人等成为自己的对象。。。

胡越
2023-03-14

@MappedSupperclass@heritation注释不同。

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

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

@heritation注释旨在在数据库表结构中具体化OOP继承模型。此外,您可以查询用@heritation注释的基类,但不能查询用@MappedSuperclass注释的基类。

 类似资料:
  • 为了解释这个问题,我需要参考POSTGRES中的一个函数: "Pgr_dijkstra"是POSTGIS的函数,而不是表。它返回源(11111)和目标(2222)之间的最短路径。结果是6列:“seq、path_seq、节点、边缘、成本和agg_cost”。 因为“pgr_dijkstra”是一个函数,所以我不能在代码中创建一个类并用@Entity注释它,还可以将@Id添加到“seq”中,并创建其他

  • 问题内容: 是否可以查询JPA EntityManager 是否分离了给定的实体?这篇SO帖子正在讨论类似的问题,但没有指出查询实体的分离状态的JPA EntityManager的方法。我希望使用JPA方式,否则将使用Hibernate特定的方式。 问题答案: 要检查给定实体是否由当前实体管理,可以使用。

  • 我有一个JPA项目(Eclipse Link),工作正常,但我想持久化一个不是实体的类(或在相同的持久化上下文中不是实体),目前我持久化引用id,然后我执行调用以检索对象。我需要知道什么是最好的方式做到这一点…我不希望在bean中添加代码作为侦听器事件,因为我希望有一个干净的bean(构造、属性、不带注释的setter和getter), 我的想法是扩展PersistenceContext(但是,我

  • 我有一个相当简单的问题。在单个事务中,我的代码如下所示: 我的实体看起来像这样: 数据库是这样设置的(方言=Oracle 11G) 因此,基于持久化实体的代码,我想我会得到如下查询: ... 但是永远不会发生。为什么实体没有刷新? 这是因为

  • 问题内容: 我在开关情况下使用枚举,但出现以下错误: NEWS FEED在FragmentName中不是常量 这是我的枚举字符串常量, 当我打电话 即使在传递的值相同的情况下,它也会在changeTitle函数中创建异常,因此,如果我已尽力解决此问题,将对您有所帮助。 问题答案: 将此代码添加到您的枚举 现在代替使用