¿Cómo mezclar estrategias de herencia con anotaciones JPA e Hibernate?
De acuerdo con laDocumentación de referencia de Hibernate debería ser posible mezclar diferentes estrategias de mapeo de herencia cuando se utilizan los metadatos XML de Hibernate:
http://docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html#inheritance-mixing-tableperclass-tablepersubclass
Sin embargo, la sección correspondiente de laGuía de referencia de anotaciones de Hibernate no cubre eso:http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#d0e1168
Por otro lado, los JavaDocs sugieren que la combinación de estrategias de herencia debería ser posible. Por ejemplo, en javax.persistence.DiscriminatorColumn dice:
La estrategia y la columna discriminante solo se especifican en la raíz de una jerarquía de clase de entidado sub jerarquía en la que una estrategia de herencia diferente Está aplicado.
El siguiente es un ejemplo para el mapeo que estoy tratando de lograr. Me gustaria usartabla por subclase mapeo cerca de la raíz de la jerarquía, pero cambie ajerarquía de tabla por clase mapeo cerca de las hojas. Aquí hay un código de ejemplo:
@Entity
@Inheritance( strategy = InheritanceType.JOINED )
public abstract class A implements Serializable
{
@Id
private String id;
// other mapped properties...
}
@Entity
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
public class BB extends A
{
// other mapped properties and associations...
}
@Entity
public class BB1 extends BB
{
// other stuff, not necessarily mapped...
}
@Entity
public class BB2 extends BB
{
// other stuff, not necessarily mapped...
}
@Entity
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
public class CC extends A
{
// other mapped properties and associations...
}
@Entity
public class CC1 extends CC
{
// other stuff, not necessarily mapped...
}
...
Lo que espero de esta asignación es tener exactamente 3 tablas:A
, BB
yCC
. AmbosBB
yCC
debe tener una columna discriminadora predeterminada llamadaDTYPE
. También deben proporcionar todas las columnas necesarias para todas las propiedades y asociaciones asignadas de sus respectivas subclases.
En cambio, la jerarquía de clases parece utilizar eltabla por subclase estrategia de herencia en todo momento. Es decir. Obtengo una tabla propia para cada una de las entidades mencionadas anteriormente. ¡Me gustaría evitar esto, ya que las hojas de la jerarquía de clases son extremadamente livianas y parece excesivo tener una tabla separada para cada una de ellas!
¿Pasé por alto algo? Cualquier consejo es muy apreciado! Estaré encantado de proporcionar información adicional ...