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":
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.Column;
import javax.persistence.Embeddable;
@Embeddable
public class Medidas {
@Column(name="PESO")
Integer peso;
@Column(name="ALTURA")
Integer altura;
...
}
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;
...
}
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;
...
}
Comentarios
Publicar un comentario