Hacemos una revisión profunda cada post de nuestro espacio con la meta de enseñarte en todo momento información certera y actual.
Solución:
@MappedSupperclass
es diferente a la @Inheritance
anotación.
@MappedSuperclass
le dice al proveedor de JPA que incluya las propiedades persistentes de la clase base como si fueran declaradas por la clase secundaria que extiende la superclase anotada con @MappedSuperclass
.
Sin embargo, la herencia solo es visible en el mundo OOP, ya que, desde la perspectiva de la base de datos, no hay indicación de la clase base. Solo la entidad de clase secundaria tendrá una tabla asignada asociada.
los @Inheritance
La anotación está destinada a materializar el modelo de herencia OOP en la estructura de la tabla de la base de datos. Más, puede consultar una clase base anotada con @Inheritance
pero no puede hacer eso para una clase base anotada con @MappedSuperclass
.
Puedo sugerir dos soluciones:
Cambiar herencia
La excepción que obtienes describe claramente tu problema: User
no es una entidad. Cualquier clase declarada como superclase con la interfaz @MappedSuperclass
no puede ser una entidad (en JPA estándar, depende de su proveedor de JPA)… déjame señalarte una respuesta que acabo de dar a un problema bastante similar
–> Tipos de superclase
Por lo tanto, definir su superclase como una entidad abstracta le dará el comportamiento deseado que describió.
Extra:
Si elige su estrategia de mapeo de herencia como @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
ni siquiera necesita varias tablas de base de datos. Aquí hay un buen ejemplo: herencia de tabla única JPA
Cambiar modelo (sugerido)
No divida su entidad de usuario en varias entidades solo por sus roles. Hacer una Enum
con todos sus roles deseados y agréguelo como un campo a su User
-entidad. Esto es mucho más común, a menos que necesite que su administrador, invitados, etc. sean un objeto propio …
Si aceptas, eres capaz de dejar un post acerca de qué le añadirías a esta noticia.