【发布时间】:2009-09-15 14:12:39
【问题描述】:
问题
我有一个名为 Data 的@MappedSuperclass 作为我数据库中每个实体的父级。它包含 Id 等通用属性。然后我有一个扩展 Data 的实体,由于其子类的通用功能,它也是 @MappedSuperclass。我的数据库中的映射是正确的。
这是我的层次结构示例
@MappedSuperclass 数据 | @MappedSuperclass +- 员工 | | @实体 | +- 全职员工 | | @实体 | +- 兼职员工 | @实体 +- 商店并且表格已正确映射:
全职员工 兼职的员工 店铺是否可以在数据库中查询所有 Employee 子类(FullTimeEmployee、PartTimeEmployee)作为 Employee 的实例而不在查询中引用子类的名称?
类似
List<Employee> allEmployees = getAllEmployees();
这个想法是,每当我决定创建另一个 Employee 子类(即 AllDayEmployee)时,我都不必更改查询以包含名称。
解决方案
因此,正如Gregory 正确指出的那样,@MappedSuperclass 不可能做到这一点。所以我把它改成了@Entity,因为我想为每个使用InheritanceType.JOINED的子类保留一个表。
所以上面的层次结构现在是
@MappedSuperclass 数据 | @实体 | @Inheritance(策略=InheritanceType.JOINED) +- 员工 | | @实体 | +- 全职员工 | | @实体 | +- 兼职员工 | @实体 +- 商店桌子还在:
全职员工 兼职的员工 店铺所以现在,我只需调用所有员工:
entityManager.createQuery("from Employee").getResultList();
【问题讨论】:
-
如果我需要两个不同的
@SequenceGenerator用于 FullTimeEmployee 和 PartTimeEmployee(我正在使用 Oracle 序列)怎么办?作为一个实体,我必须在 Employee 类上指定@Id。