jueves, 29 de septiembre de 2011

Mapeos de Herencia con Hibernate

Hibernate provee 3 estrategias para resolver el mapeo de herencias.

  • La primera es utilizar una sola tabla lo que es recomendable cuando los objetos “hijos” o subclases no agregan gran cantidad de propiedades.
  • La segunda es utilizar una tabla para la clase “Padre” y los atributos de las subclases en otras tablas.
  • La tercera es utilizar una tabla por clase.


Si utilizamos una sola tabla deberíamos utilizar una columna que indique de que tipo es el registro que se esta guardando. Este registro se llama discriminator . Por ejemplo en el mapeo de nuestra clase padre deberíamos agregar la siguiente entrada para indicar el dicriminador:

 

Y además debemos indicar la subclase:
 
	 
	..... 
 

Con anotaciones podemos hacerlo como muestra el ejemplo:
@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn( 
	name="planetype", 
	discriminatorType=DiscriminatorType.STRING 
) 
@DiscriminatorValue("Plane") 
public class Plane { ... } 

@Entity 
@DiscriminatorValue("A320") 
public class A320 extends Plane { ... } 
Si utilizamos una tabla con los datos genéricos y otras por subclase se debe mapear de la siguiente manera:
 
	
	 
	 
	..... 
 

El atributo key indica cual es el nombre de la columna que contiene el id de la clase padre. Veamos un ejemplo:
 
 
	 
		 
			 
				 
			 
			...
			 
				 
				 
			 
		 
 

Si utilizamos una tabla por clase se debe declarar de la siguiente manera:
 
 
..... 
 

En este caso no es necesario un discriminador ya que cada tabla tiene su clase.