miércoles, 13 de mayo de 2009

Hibernate: @Embeddable

Supongamos que estamos ante la siguiente situación: varias clases de nuestro modelo comparten ciertos atributos, y por las razones que sean, no es posible/conveniente plantearlo con herencia. Por ejemplo, varias clases almacenan un peso y una altura. Podríamos tener una clase Medidas, que centralizara estos campos, e indicar que será "embebida":


package es.gmr.pruebas;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Medidas {
   @Column(name="PESO")
   Integer peso;
   @Column(name="ALTURA")
    Integer altura;

    ...

}


Ahora, cada clase que necesite estos campos, sólo tendrá que añadir una instancia de Medidas y ya tendrá incluida las anotaciones para peso y altura como si fueran atributos propios.

¿Pero qué pasa si para una determinada clase, las columnas de la tabla correspondiente en base de datos no se llaman PESO y ALTURA?. ¿O si una clase en concreto necesita dos instancias de Medidas? En esos casos podríamos sobrescribir el mapeo, con la anotación @AttributeOverrides. Un ejemplo:


package es.gmr.pruebas;

import javax.persistence.*;

@Entity
@Table(name = "MY_CLASE")
public class MyClase {
    // Usará los valores dados por defecto en el mapeo
    Medidas unaMedida;

    @Embedded
    @AttributeOverrides( {
       @AttributeOverride(name="peso", column =
          @Column(name="OTRO_PESO") ),
       @AttributeOverride(name="altura", column =
          @Column(name="OTRA_ALTURA") )
    } )
    IntegerMedidas otraMedida;

    ...
}

No hay comentarios:

Publicar un comentario