Что означает @AttributeOverride? - PullRequest
       25

Что означает @AttributeOverride?

31 голосов
/ 13 декабря 2010

В настоящее время я возвращаюсь к EJB, и пока меня не было, все кардинально изменилось (пока что к лучшему). Тем не менее, я натолкнулся на концепцию, с которой я борюсь, и хотел бы лучше понять, так как она, кажется, немного используется в нашем (где я работаю, не я и все голоса в моей голове) коде. *

Вот пример, который я нашел в книге. Это часть примера, показывающего, как использовать аннотацию @EmbeddedId:

@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;

    ...
}

Класс EmbeddedEmployeePK является довольно простым классом @Embeddable, который определяет пару @Columns: lastName и ssn.

О, и я взял этот пример из О'Рейли Enterprise JavaBeans 3.1 от Rubinger & Burke.

Заранее благодарим за любую помощь, которую вы можете оказать мне.

Ответы [ 5 ]

39 голосов
/ 13 декабря 2010

Это говорит о том, что атрибуты, составляющие встроенный идентификатор, могут иметь предопределенные (посредством явных или неявных отображений) имена столбцов. Используя @AttributeOverride, вы говорите «игнорируйте другую имеющуюся у вас информацию относительно того, в каком столбце она хранится, и используйте ту, которую я здесь указал».

26 голосов
/ 11 апреля 2012

AttributeOverride

В классе UserDetails я переопределил homeAddress & officeAddress с Address

Этот POJO с одним адресом будет действовать для двух таблиц в БД.

DB:

Table1      Table2
STREET_NAME HOME_STREET_NAME
CITY_NAME   HOME_CITY_NAME
STATE_NAME  HOME_STATE_NAME
PIN_CODE    HOME_PIN_CODE
8 голосов
/ 13 декабря 2010

Класс EmbeddedEmployeePK - это довольно простой класс @Embeddable, который определяет пару @Columns: lastName и ssn.

Не совсем - EmbeddedEmployeePK определяет пару свойства , которые затем сопоставляются со столбцами.Аннотации @AttributeOverride позволяют переопределять столбцы, в которые отображаются свойства встроенного класса.

Вариант использования для этого - использование встраиваемого класса в разных ситуациях, когда имена его столбцов различаются, и некоторый механизм.требуется, чтобы вы могли изменить эти сопоставления столбцов.Например, скажем, у вас есть объект, который содержит два отдельных экземпляра одной и той же встраиваемой структуры - они не могут оба сопоставляться с одинаковыми именами столбцов.

1 голос
/ 10 февраля 2017

Вы также можете переопределить другие свойства столбца (не только имена).
Предположим, что вы хотите изменить длину SSN в зависимости от того, кто внедряет ваш компонент.Вы можете определить @AttributeOverride для столбца следующим образом:

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

См. "2.2.2.4. Встроенные объекты (или компоненты)" * в документации по аннотациям Hibernate.

Чтобы сохранить другие свойства @Column (например, name и nullable), оставьте их в переопределенном столбце так же, как вы указали в исходном столбце.

0 голосов
/ 13 декабря 2010

JPA пытается сопоставить имена полей с именами столбцов в источнике данных, поэтому вы видите здесь перевод между именем переменной поля и именем столбца в базе данных.

...