Ampliación de la entidad de hibernación para agregar relaciones no propietarias, apuntando a la misma tabla

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.

preguntado el 28 de agosto de 12 a las 14:08

1 Respuestas

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

Gracias, esto es lo que estaba buscando. La modificación de BackOfficeUser debe ser compatible con nuestro legado: sebastien lorber

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.