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

в настоящее время я возвращаюсь (назад) к скорости с 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 ответов


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


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

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

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

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


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

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

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

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


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