2010-12-13 11 views
25

Actualmente estoy volviendo a la velocidad con EJB y mientras estuve fuera, cambió drásticamente (hasta ahora para mejor). Sin embargo, me he topado con un concepto con el que estoy luchando y me gustaría entender mejor, ya que parece que se utiliza en nuestro código (donde trabajo, no en mí y en todas las voces en mi cabeza) bastante.¿Qué significa @AttributeOverride?

Este es el ejemplo que he encontrado en un libro. Es parte de un ejemplo que muestra cómo utilizar la anotación @EmbeddedId:

@Entity 
public class Employee implements java.io.Serializable 
{ 
    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name="lastName", [email protected](name="LAST_NAME"), 
     @AttributeOverride(name="ssn", [email protected](name="SSN")) 
    }) 

    private EmbeddedEmployeePK pk; 

    ... 
} 

La clase EmbeddedEmployeePK es una clase bastante sencillo @Embeddable que define un par de @Columns: lastName y ssn.

Ah, y levanté este ejemplo de Enterprise JavaBeans 3.1 de O'Reilly por Rubinger & Burke.

Gracias de antemano por cualquier ayuda que pueda darme.

Respuesta

33

Se dice que los atributos que componen el ID incorporado pueden tener predefinidos (mediante asignaciones explícitas o implícitas) nombres de columnas. Al usar el @AttributeOverride estás diciendo "ignora qué otra información tienes con respecto a qué columna está almacenada y utiliza la que especifico aquí".

+0

Ok, genial que tiene mucho más sentido que lo que los autores ponen en el libro. ¡muchas gracias! – jaydel

+0

respuesta agradable y sensata –

8

La clase EmbeddedEmployeePK es una clase @Embeddable bastante sencilla que define un par de @Columns: lastName y ssn.

No bastante - EmbeddedEmployeePK define un par de propiedades, que luego se asignan a las columnas. Las anotaciones @AttributeOverride le permiten anular las columnas a las que se asignan las propiedades de la clase incrustada.

El caso de uso para esto es cuando la clase incrustada se usa en diferentes situaciones en las que los nombres de sus columnas son diferentes, y se necesita algún mecanismo para permitirle cambiar esas asignaciones de columnas. Por ejemplo, supongamos que tiene una entidad que contiene dos instancias separadas de la misma incrustable: no pueden mapearse a los mismos nombres de columna.

0

JPA intenta asignar nombres de campo a nombres de columna en un origen de datos, por lo que lo que está viendo aquí es la traducción entre el nombre de una variable de campo y el nombre de una columna en una base de datos.

16

AttributeOverride

En la clase DetallesUsuario, he anulado homeAddress & officeAddress con Address

0

Puede anular también otras propiedades de la columna (no sólo los nombres).
Supongamos que desea cambiar la longitud del SSN en función de quién incruste su componente. Puede definir un @AttributeOverride para la columna de la siguiente manera:

@AttributeOverrides({ 
    @AttributeOverride(name = "ssn", column = @Column(name = "SSN", length = 11)) 
}) 
private EmbeddedEmployeePK pk; 

Ver "2.2.2.4. Embedded objects (aka components)" en la documentación Anotaciones de Hibernate.

Para preservar otras propiedades @Column (como name y nullable) guárdelas en la columna reemplazada de la misma forma que especificó en la columna original.