我有一个@MappedSuperclass称为Data的数据库,它是数据库中每个实体的父级。它包含Id等通用属性。然后,我有了一个扩展Data的实体,这也是@MappedSuperclass由于其子类的通用功能而引起的。我的数据库中的映射是正确的。
@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。
InheritanceType.JOINED
所以上面的层次是现在
@MappedSuperclass Data | @Entity | @Inheritance(strategy=InheritanceType.JOINED) +- Employee | | @Entity | +- FullTimeEmployee | | @Entity | +- PartTimeEmployee | @Entity +- Store
表格仍然是:
所以现在,为了让所有员工都可以打电话给我:
entityManager.createQuery("from Employee").getResultList();
否,如果您使用@MappedSuperclass
这样做的原因是,当您将基类定义为@MappedSuperclass时,不会为基类生成表,而是将所有属性复制到具体表中。在您的示例中,仅存在FullTimeEmployee,PartTimeEmployee和Store表。
如果要能够查询基类实体,则需要为基类选择其他映射。在基类上使用@Inheritance批注,然后选择3种可能的映射策略之一-SINGLETABLE,TABLE PER CLASS或JOINED