Problema
Tengo un @MappedSuperclass
llamada de datos como el padre de toda entidad en mi base de datos. Contiene atributos comunes como Id. Luego tengo una entidad que extiende Datos que también es @MappedSuperclass
debido a la funcionalidad común de sus subclases. La asignación en mi base de datos es correcta.Selección MappedSuperclass de la base de datos (Hibernate)
Aquí es un ejemplo de mi jerarquía
@MappedSuperclass Data | @MappedSuperclass +- Employee | | @Entity | +- FullTimeEmployee | | @Entity | +- PartTimeEmployee | @Entity +- Store
y las mesas están bien mapeados:
FullTimeEmployee PartTimeEmployee Store
¿Hay alguna forma para consultar la base de datos para todas las subclases de los empleados (FullTimeEmployee, PartTimeEmployee) como instancias del empleado sin referir el nombre de las subclases en la consulta?
Algo así como
List<Employee> allEmployees = getAllEmployees();
La idea es que cada vez que decido crear otra subclase de empleados (es decir, AllDayEmployee) no voy a tener que cambiar la consulta para incluir el nombre.
Solución
Así que, como Gregory de manifiesto acertadamente, esto no es posible con @MappedSuperclass
. Así que lo cambié a @Entity y, como quería preservar una tabla para cada subclase, usé InheritanceType.JOINED
.
Así que la jerarquía anterior es ahora
@MappedSuperclass Data | @Entity | @Inheritance(strategy=InheritanceType.JOINED) +- Employee | | @Entity | +- FullTimeEmployee | | @Entity | +- PartTimeEmployee | @Entity +- Store
y las mesas están todavía:
FullTimeEmployee PartTimeEmployee Store
Así que ahora, para obtener todos los empleados que simplemente llamo:
entityManager.createQuery("from Employee").getResultList();
¿y si necesito dos 'SequenceGenerator' @ diferente para FullTimeEmployee y PartTimeEmployee (estoy usando Oracle secuencias)? Al ser una Entidad, debo especificar el '@ Id' en la clase Empleado. – drakyoko