一尘不染

从数据库中选择MappedSuperclass(hibernate)

hibernate

问题

我有一个@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();

阅读 248

收藏
2020-06-20

共1个答案

一尘不染

否,如果您使用@MappedSuperclass

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

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

2020-06-20