当前位置: 首页 > 面试题库 >

从数据库中选择MappedSuperclass(hibernate)

黄仲渊
2023-03-14
问题内容

我有一个@MappedSuperclass称为Data的数据库,它是数据库中每个实体的父级。它包含Id等通用属性。然后,我有了一个扩展Data的实体,这也是@MappedSuperclass由于其子类的通用功能而引起的。我的数据库中的映射是正确的。

这是我的等级制度的一个例子

@MappedSuperclass
Data  
 |  @MappedSuperclass
 +- Employee  
 |      |  @Entity
 |      +- FullTimeEmployee
 |      |  @Entity
 |      +- PartTimeEmployee
 |  @Entity
 +- Store

并且表已正确映射:

FullTimeEmployee  
PartTimeEmployee  
Store

无论如何,是否在数据库中查询所有作为Employee实例的Employee子类(FullTimeEmployee,PartTimeEmployee),而不在查询中引用子类的名称?

就像是

List<Employee> allEmployees = getAllEmployees();

这个想法是,每当我决定创建Employee的另一个子类(即AllDayEmployee)时,我都不必更改查询以包括姓名。

因此,正如Gregory正确指出的那样,使用不可能@MappedSuperclass。所以我将其更改为@Entity,因为我想为我使用的每个子类保留一个表InheritanceType.JOINED

所以上面的层次是现在

@MappedSuperclass
Data  
 |  @Entity
 |  @Inheritance(strategy=InheritanceType.JOINED)
 +- Employee  
 |      |  @Entity
 |      +- FullTimeEmployee
 |      |  @Entity
 |      +- PartTimeEmployee
 |  @Entity
 +- Store

表格仍然是:

FullTimeEmployee  
PartTimeEmployee  
Store

所以现在,为了让所有员工都可以打电话给我:

entityManager.createQuery("from Employee").getResultList();

问题答案:

否,如果您使用@MappedSuperclass

这样做的原因是,当您将基类定义为@MappedSuperclass时,不会为基类生成表,而是将所有属性复制到具体表中。在您的示例中,仅存在FullTimeEmployee,PartTimeEmployee和Store表。

如果要能够查询基类实体,则需要为基类选择其他映射。在基类上使用@Inheritance批注,然后选择3种可能的映射策略之一-SINGLETABLE,TABLE PER CLASS或JOINED



 类似资料:
  • 我使用以下列表从控制器填充了JSP中的下拉列表:“” 例如,我使用下拉菜单将5保存为db中thirdPartyOccupationId的值。当我重新加载页面时,值5不是选中的值。 同一段代码正在处理不同的字段,我不知道我错过了什么。 模型类: ReportClass.java 控制器.java 感谢任何指点。

  • 我在mysql数据库中有名为的表,其中存在类、学生姓名等。 我想在jsp中使用select选项,这样当且仅当首先选择class时,在选择class之后,该特定类的所有学生姓名都应该通过从数据库中检索记录自动(动态)显示在另一个select下拉列表中。 在这里我想使用servlet进行数据库连接,并通过通过jsp访问所有数据库记录

  • 我目前在一个论坛网站上工作,有一个向上投票系统。然而,有一些烦人的,可能是句法错误困扰着我。我说的是这段代码。 null 谢谢

  • 命令用于选择数据库,如果想在一个数据库上工作,比如:创建表,查询表,更新,创建存储过程等等,那么首先需要选择一个目标数据库。 示例 假设在MariaDB数据库服务器中,存在有多个数据库,我们必须选择一个特定的数据库。 例如,在下图中显示了多个数据库: 这里我们将使用数据库来创建表等。所以需要使用以下命令。 在执行上面查询语句后,就已经选择数据库。之后就可以在里面创建表等数据对象了。执行上面查询语句

  • 上一章节我们讲了如何创建数据库,接下来我们来讨论如何去选择我们创建的数据库。 数据库的命令窗口 PostgreSQL 命令窗口中,我们可以命令提示符后面输入 SQL 语句: 使用 \l 用于查看已经存在的数据库: 接下来我们可以使用 \c + 数据库名 来进入数据库: 系统命令行窗口 在系统的命令行查看,我么可以在连接数据库后面添加数据库名来选择数据库: pgAdmin 工具 pgAdmin 工具

  • 在MySQL 中就有很多系统自带的数据库,那么在操作数据库之前就必须要确定是哪一个数据库。 在 MySQL 中, USE 语句用来完成一个数据库到另一个数据库的跳转。 当用 CREATE DATABASE 语句创建数据库之后,该数据库不会自动成为当前数据库,需要用 USE 来指定当前数据库。其语法格式为: 该语句可以通知 MySQL 把 所指示的数据库作为当前数据库。该数据库保持为默认数据库,直到