web-dev-qa-db-fra.com

Que signifie @AttributeOverride?

Je suis actuellement (de retour) au courant avec EJB et pendant mon absence, cela a radicalement changé (jusqu'à présent pour le mieux). Cependant, je suis tombé sur un concept avec lequel je me bats et que j'aimerais mieux comprendre car il semble être utilisé dans notre code (où je travaille, pas moi et toutes les voix dans ma tête) un peu.

Voici l'exemple que j'ai trouvé dans un livre. Cela fait partie d'un exemple montrant comment utiliser le @EmbeddedId annotation:

@Entity
public class Employee implements Java.io.Serializable
{
    @EmbeddedId
    @AttributeOverrides({
        @AttributeOverride(name="lastName", column=@Column(name="LAST_NAME"),
        @AttributeOverride(name="ssn", column=@Column(name="SSN"))
    })

    private EmbeddedEmployeePK pk;

    ...
}

La classe EmbeddedEmployeePK est une méthode assez simple @Embeddable classe qui définit une paire de @Columns: lastName et ssn.

Oh, et j'ai retiré cet exemple de O'Reilly's Enterprise JavaBeans 3.1 de Rubinger & Burke.

Merci d'avance pour toute aide que vous pouvez me donner.

32
jaydel

Cela signifie que les attributs qui composent l'ID incorporé peuvent avoir des noms de colonne prédéfinis (via des mappages explicites ou implicites). En utilisant le @AttributeOverride vous dites "ignorez les autres informations dont vous disposez concernant la colonne dans laquelle elles sont stockées et utilisez celle que je spécifie ici".

39
zmf

AttributeOverride

Dans la classe UserDetails, j'ai remplacé homeAddress & officeAddress par Address

Ce POJO One Address agira pour deux tables dans DB.

DB:

Table1      Table2
STREET_NAME HOME_STREET_NAME
CITY_NAME   HOME_CITY_NAME
STATE_NAME  HOME_STATE_NAME
PIN_CODE    HOME_PIN_CODE
26
Ravi Parekh

La classe EmbeddedEmployeePK est une classe @Embeddable assez simple qui définit une paire de @Columns: lastName et ssn.

Pas tout à fait - EmbeddedEmployeePK définit une paire de propriétés, qui sont ensuite mappés sur des colonnes. Le @AttributeOverride les annotations vous permettent de remplacer les colonnes auxquelles les propriétés de la classe incorporée sont mappées.

Le cas d'utilisation pour cela est lorsque la classe intégrable est utilisée dans différentes situations où ses noms de colonnes diffèrent, et un mécanisme est requis pour vous permettre de modifier ces mappages de colonnes. Par exemple, supposons que vous ayez une entité qui contient deux instances distinctes du même élément incorporable - elles ne peuvent pas toutes les deux correspondre aux mêmes noms de colonne.

8
skaffman

Vous pouvez également remplacer d'autres propriétés de colonne (pas seulement les noms).
Supposons que vous souhaitiez modifier la longueur du SSN en fonction de la personne qui incorpore votre composant. Vous pouvez définir un @AttributeOverride pour la colonne comme celle-ci:

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

Voir "2.2.2.4. Objets incorporés (aka composants)" dans la documentation Hibernate Annotations.

Afin de préserver les autres @Column propriétés (telles que name et nullable) les conservent dans la colonne remplacée de la même manière que vous l'avez spécifié dans la colonne d'origine.

1
naXa

JPA essaie de mapper les noms de champ aux noms de colonne dans une source de données, donc ce que vous voyez ici est la traduction entre le nom d'une variable de champ et le nom d'une colonne dans une base de données.

0
Mike Yockey