Ampliación de la entidad de hibernación para agregar relaciones no propietarias, apuntando a la misma tabla
Frecuentes
Visto 1,518 veces
4
Trabajo en un gran proyecto modularizado con muchos módulos maven y la gestión de dependencias es bastante compleja.
En nuestro módulo central, tenemos una entidad BackOfficeUser con muchos atributos. Esta entidad se utiliza en la mayoría de los módulos aplicativos.
Pero uno de mis módulos XXX necesita mejorar al usuario con una colección de entidades UserRule.
Lo que me gustaría saber es si es posible subclasificar el BackOfficeUser central para crear un XXXBackOfficeUser en mi aplicación, con una nueva relación que no sea propiedad de la entidad, que no necesita una nueva columna en la tabla de base de datos central de BackOfficeUser.
Sé que puedo crear un DAO y llamar rulesDAO.findByUser(BackOfficeUser user)
Pero me gustaría saber si es posible tener en su lugar XXXBackOfficeUser.getRules()
Todo eso sin modificar la clase principal BackOfficeUser que es utilizada por MUCHOS otros módulos, y que no es una Superclase asignada ni nada más que una entidad de hibernación normal.
1 Respuestas
1
No es posible sin modificar la clase BackOfficeUser, pero es posible sin modificar la tabla donde se conserva BackOfficeUser. La modificación necesaria para la clase BackOffice es:
@Inheritance(strategy = InheritanceType.JOINED)
Con Hibernate, esto no hace que se agregue una columna DTYPE adicional a la tabla raíz, porque Hibernate admite herencia unida sin columna discriminadora. La herencia conjunta sin discriminador no es portátil, porque la especificación no requiere soporte para ello. La consecuencia es que para definir el tipo real de BackOfficeUser, las consultas siempre se unirán a la nueva tabla.
La implementación es más o menos como sigue:
//Existing BackOfficeUser, @Inheritance is added
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class BackOfficeUser {
@Id private Integer id;
}
//New class that extends BackOfficeUser. Will have dedicated
//table for added persistent attributes, shared attributes
//are persisted to existing table "BackOfficeUser"
@Entity
public class XxxBackOfficeUser extends BackOfficeUser {
private String someAttribute
@ManyToMany (mappedBy = "xxxBackOfficeUsers")
private List<Rule> rules;
}
//New entity class which does have relation to XxxBackOfficeUser
@Entity
public class Rule {
@Id private Integer id;
@ManyToMany
private List<XxxBackOfficeUser> xxxBackOfficeUsers;
}
Respondido 28 ago 12, 19:08
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas java hibernate jpa or haz tu propia pregunta.
Gracias, esto es lo que estaba buscando. La modificación de BackOfficeUser debe ser compatible con nuestro legado: sebastien lorber