4.2.1.2. Аннотации сущностей
В данном разделе описаны все поддерживаемые платформой аннотации классов и атрибутов сущностей.
Аннотации пакета javax.persistence
обеспечивают работу JPA, аннотации пакетов com.haulmont.*
предназначены для управления метаданными и другими механизмами платформы.
Если для аннотации указано только простое имя класса, подразумевается что это класс платформы, расположенный в одном из пакетов com.haulmont.*
Аннотации класса
Объявляет класс сущностью модели данных.
Параметры:
-
name
- имя сущности, обязательно должно начинаться с префикса, отделенного знаком$
. Желательно использовать в качестве префикса короткое имя проекта для формирования отдельного пространства имен.
Пример:
@Entity(name = "sales$Customer")
-
@javax.persistence.MappedSuperclass
-
Определяет, что данный класс является предком некоторых сущностей, и его атрибуты должны быть использованы в составе сущностей-наследников. Такой класс не сопоставляется никакой отдельной таблице БД.
-
@javax.persistence.Table
-
Определяет таблицу базы данных для данной сущности.
Параметры:
-
name
- имя таблицы
Пример:
@Table(name = "SALES_CUSTOMER")
-
-
@javax.persistence.Embeddable
-
Определяет встраиваемую сущность, экземпляры которой хранятся вместе с владеющей сущностью в той же таблице.
Для задания имени сущности требуется применение аннотации @MetaClass.
-
@javax.persistence.Inheritance
-
Определяет стратегию наследования для иерархии классов сущностей. Данная аннотация должна быть помещена на корневом классе иерархии.
Параметры:
-
strategy
- стратегия, по умолчаниюSINGLE_TABLE
-
-
@javax.persistence.DiscriminatorColumn
-
Используется для определения колонки БД, отвечающей за различение типов сущностей в случае стратегий наследования
SINGLE_TABLE
иJOINED
.Параметры:
-
name
- имя колонки-дискриминатора -
discriminatorType
- тип данных колонки-дискриминатора
Пример:
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.INTEGER)
-
-
@javax.persistence.DiscriminatorValue
-
Определяет значение колонки-дискриминатора для данной сущности. Эта аннотация должна быть помещена на конкретном классе сущности.
Пример:
@DiscriminatorValue("0")
-
@javax.persistence.PrimaryKeyJoinColumn
-
Используется в случае стратегии наследования
JOINED
для указания колонки внешнего ключа данной сущности, ссылающегося на первичный ключ сущности-предка.Параметры:
-
name
- имя колонки внешнего ключа данной сущности -
referencedColumnName
- имя колонки первичного ключа сущности предка
Пример:
@PrimaryKeyJoinColumn(name = "CARD_ID", referencedColumnName = "ID")
-
-
@NamePattern
-
Определяет способ получения имени экземпляра, возвращаемого методом
Instance.getInstanceName()
.Значением аннотации должна быть строка вида
{0}|{1}
, где-
{0}
- строка форматирования по правиламString.format()
, или имя метода данного объекта с префиксом#
. Метод должен возвращатьString
и не иметь параметров. -
{1}
- разделенный запятыми список имен полей класса, соответствующий формату{0}
. В случае использования в{0}
метода список полей все равно необходим, так как по нему формируется представление_minimal
.
Примеры:
@NamePattern("%s|name")
@NamePattern("#getCaption|login,name")
-
-
@Listeners
-
Определяет список слушателей, предназначенных для реакции на события жизненного цикла экземпляров сущности на уровне Middleware.
Значением аннотации должна быть строка или массив строк с именами классов слушателей - см. Entity Listeners.
Строки используются здесь вместо ссылок на классы потому, что классы слушателей находятся только на уровне Middleware и не доступны клиентскому коду, в то время как классы самих сущностей используются на всех уровнях.
Примеры:
@Listeners("com.haulmont.cuba.security.listener.UserEntityListener")
@Listeners({"com.company.sales.entity.FooListener","com.company.sales.entity.BarListener"})
-
@MetaClass
-
Используется для объявления неперсистентной или встраиваемой сущности (т.е. когда аннотация
@javax.persistence.Entity
не применима)Параметры:
-
name
- имя сущности, обязательно должно начинаться с префикса, отделенного знаком$
. Желательно использовать в качестве префикса короткое имя проекта для формирования отдельного пространства имен.
Пример:
@MetaClass(name = "sales$Customer")
-
-
@SystemLevel
-
Указывает, что данная сущность является системной и не должна быть доступна для выбора пользователем в различных списках сущностей, например, как тип параметра универсального фильтра или тип динамического атрибута.
-
@EnableRestore
-
Указывает, что экземпляры данной сущности доступны для восстановления после мягкого удаления в специальном экране
core$Entity.restore
, доступном через пункт Administration > Data Recovery главного меню. -
@TrackEditScreenHistory
-
Указывает, что для данной сущности будет запоминаться история открытия экранов редактирования (
{имя_сущности}.edit
) с возможностью отображения в специальном экранеsec$ScreenHistory.browse
, доступном через пункт Help > History главного меню. -
@Extends
-
Указывает, что данная сущность является расширением и должна повсеместно использоваться вместо базовой. См. Расширение функциональности.
-
@PostConstruct
-
Данная аннотация может быть указана для метода класса. Такой метод будет вызван сразу после создания экземпляра сущности через Metadata.create(). Это удобно, если для инициализации экземпляра сущности требуется вызов каких-либо бинов. Пример см. в Инициализация полей сущности.
Аннотации атрибутов
Аннотации атрибутов устанавливаются на соответствующие поля класса, за одним исключением: если требуется объявить неизменяемый (read only) неперсистентный атрибут foo
, то достаточно создать метод доступа getFoo()
и поместить на этот метод аннотацию @MetaProperty
.
-
@javax.persistence.Transient
-
Указывает, что данное поле не хранится в БД, т.е. является неперсистентным.
Поля поддерживаемых JPA типов (см. http://docs.oracle.com/javaee/7/api/javax/persistence/Basic.html) по умолчанию являются персистентными, поэтому аннотация
@Transient
обязательна для объявления неперсистентного атрибута такого типа.Для включения
@Transient
атрибута в метаданные, необходимо также указать аннотацию@MetaProperty
. -
@javax.persistence.Column
-
Определяет колонку БД, в которой будут храниться значения данного атрибута.
Параметры:
-
name
- имя колонки -
length
- (необязательный параметр, по умолчанию255
) - длина колонки. Используется также при формировании метаданных и, в конечном счете, может ограничивать максимальную длину вводимого текста в визуальных компонентах, работающих с данным атрибутом. Для отмены ограничения по длине атрибуту необходимо добавить аннотацию @Lob. -
nullable
- (необязательный параметр, по умолчаниюtrue
) - может ли атрибут содержатьnull
. При указанииnullable = false
JPA контролирует наличие значения поля при сохранении, кроме того, визуальные компоненты, работающие с данным атрибутом, могут сигнализировать пользователю о необходимости ввода значения.
-
-
@javax.persistence.Id
-
Указывает, что данный атрибут является первичным ключом сущности. Обычно эта аннотация присутствует на поле базового класса, такого как BaseUuidEntity. Использовать эту аннотацию в конкретном классе сущности необходимо только при наследовании от базового класса
BaseStringIdEntity
(то есть при создании сущности со строковым первичным ключом).
-
@javax.persistence.ManyToOne
-
Определяет атрибут-ссылку на сущность с типом ассоциации много-к-одному.
Параметры:
-
fetch
- (по умолчаниюEAGER
) параметр, определяющий, будет ли JPA жадно загружать ассоциированную сущность. Данный параметр всегда должен быть установлен в значениеLAZY
, так как в CUBA-приложении политика загрузки связей определяется динамически на основе механизма представлений. -
optional
- (необязательный параметр, по умолчаниюtrue
) - может ли атрибут содержатьnull
. При указанииoptional = false
JPA контролирует наличие ссылки при сохранении, кроме того, визуальные компоненты, работающие с данным атрибутом, могут сигнализировать пользователю о необходимости ввода значения.
Например, несколько экземпляров
Order
(заказов) ссылаются на один экземплярCustomer
(покупателя), в этом случае классOrder
должен содержать следующее объявление:@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CUSTOMER_ID") protected Customer customer;
-
-
@javax.persistence.OneToMany
-
Определяет атрибут-коллекцию ссылок на сущность с типом ассоциации один-ко-многим.
Параметры:
-
mappedBy
- поле связанной сущности, определяющее ассоциацию -
targetEntity
- тип связанной сущности. Необязательный параметр, если коллекция объявлена с использованием Java generics. -
fetch
- (необязательный параметр, по умолчаниюLAZY
) - определяет, будет ли JPA жадно загружать коллекцию связанных сущностей. Необходимо всегда оставлять значение по умолчаниюLAZY
, так как в CUBA-приложении политика загрузки связей определяется динамически на основе механизма представлений. -
cascade
- (необязательный параметр, по умолчанию{}
) - каскадирование операций определяет, какие операции над сущностью должны быть применены к ассоциированным сущностям. Каскадирование на данном уровне не рекомендуется использовать.
Например, несколько экземпляров
Item
(пунктов заказа) ссылаются на один экземплярOrder
(заказ) с помощью@ManyToOne
поляItem.order
, в этом случае классOrder
может содержать коллекцию экземпляровItem
:@OneToMany(mappedBy = "order") protected Set<Item> items;
-
-
@javax.persistence.OneToOne
-
Определяет атрибут-ссылку на сущность с типом ассоциации один-к-одному.
Параметры:
-
fetch
- (по умолчаниюEAGER
) параметр, определяющий, будет ли JPA жадно загружать ассоциированную сущность. Данный параметр всегда должен быть установлен в значениеLAZY
, так как в CUBA-приложении политика загрузки связей определяется динамически на основе механизма представлений. -
mappedBy
- поле связанной сущности, определяющее ассоциацию. Требуется устанавливать только на ведомой стороне ассоциации. -
optional
- (необязательный параметр, по умолчаниюtrue
) - может ли атрибут содержатьnull
. При указанииoptional = false
JPA контролирует наличие ссылки при сохранении, кроме того, визуальные компоненты, работающих с данным атрибутом, могут сигнализировать пользователю о необходимости ввода значения.
Пример ведущей стороны ассоциации, класс
Driver
:@OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CALLSIGN_ID") protected DriverCallsign callsign;
Пример ведомой стороны ассоциации, класс
DriverCallsign
:@OneToOne(fetch = FetchType.LAZY, mappedBy = "callsign") protected Driver driver;
-
-
@javax.persistence.ManyToMany
-
Определяет атрибут-коллекцию ссылок на сущность с типом ассоциации много-ко-многим.
Ассоциация много-ко-многим всегда имеет ведущую сторону и может иметь обратную сторону - ведомую. На ведущей стороне указывается дополнительная аннотация
@JoinTable
, на ведомой стороне - параметрmappedBy
.Параметры:
-
mappedBy
- поле связанной сущности, определяющее ассоциацию с ведущей стороны. Необходимо указывать только на ведомой стороне. -
targetEntity
- тип связанной сущности. Необязательный параметр, если коллекция объявлена с использованием Java generics. -
fetch
- (необязательный параметр, по умолчаниюLAZY
) - определяет, будет ли JPA жадно загружать коллекцию связанных сущностей. Необходимо всегда оставлять значение по умолчаниюLAZY
, так как в CUBA-приложении политика загрузки связей определяется динамически на основе механизма представлений.
-
-
@javax.persistence.JoinColumn
-
Используется для указания колонки БД, определяющей ассоциацию между сущностями. Наличие этой аннотации указывает, что данная сторона отношения является владеющей (owning).
Параметры:
-
name
- имя колонки
Пример:
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "CUSTOMER_ID") protected Customer customer;
-
-
@javax.persistence.JoinTable
-
Используется для указания таблицы связи на ведущей стороне
@ManyToMany
ассоциации.Параметры:
-
name
- имя таблицы связи -
joinColumns
- элемент@JoinColumn
, определяющий колонку таблицы связей, соответствующую первичному ключу ведущей стороны ассоциации (т.е. содержащей аннотацию@JoinTable
) -
inverseJoinColumns
- элемент@JoinColumn
, определяющий колонку таблицы связей, соответствующую первичному ключу ведомой стороны ассоциации
Пример атрибута
customers
классаGroup
, являющегося ведущей стороной ассоциации:@ManyToMany @JoinTable(name = "SALES_CUSTOMER_GROUP_LINK", joinColumns = @JoinColumn(name = "GROUP_ID"), inverseJoinColumns = @JoinColumn(name = "CUSTOMER_ID")) protected Set<Customer> customers;
Пример атрибута
groups
классаCustomer
, являющегося ведомой стороной этой же ассоциации:@ManyToMany(mappedBy = "customers") protected Set<Group> groups;
-
-
@javax.persistence.OrderBy
-
Определяет порядок элементов в атрибуте-коллекции на момент извлечения из базы данных. Данную аннотацию необходимо задавать для упорядоченных коллекций, таких как
List
илиLinkedHashSet
для получения предсказуемого порядка следования элементов.Параметры:
-
value
- строка, определяющая порядок, в формате:orderby_list::= orderby_item [,orderby_item]* orderby_item::= property_or_field_name [ASC | DESC]
Пример:
@OneToMany(mappedBy = "user") @OrderBy("createTs") protected List<UserRole> userRoles;
-
-
@javax.persistence.Embedded
-
Определяет атрибут типа встраиваемой сущности, в свою очередь аннотированной
@Embeddable
.Пример:
@Embedded protected Address address;
-
@javax.persistence.Temporal
-
Для атрибута типа
java.util.Date
уточняет тип хранимого значения: дата, время или дата+время.Параметры:
-
value
- тип хранимого значения:DATE
,TIME
,TIMESTAMP
Пример:
@Column(name = "START_DATE") @Temporal(TemporalType.DATE) protected Date startDate;
-
-
@javax.persistence.Version
-
Указывает, что данное поле хранит версию для поддержки оптимистичной блокировки сущностей.
Применение такого поля необходимо при реализации классом сущности интерфейса
Versioned
(базовый классStandardEntity
уже содержит такое поле).Пример:
@Version @Column(name = "VERSION") private Integer version;
-
@javax.persistence.Lob
-
Указывает, что данный атрибут не имеет ограничений длины. Применяется совместно с аннотацией
@Column
. Если@Lob
указан, то длина, заданная в@Column
явно или по умолчанию, игнорируется.Пример:
@Column(name = "DESCRIPTION") @Lob private String description;
-
@MetaProperty
-
Указывает, что данный атрибут должен быть включен в метаданные. Данная аннотация может быть установлена как на поле класса, так и на метод доступа, в случае отсутствия соответствующего атрибуту поля.
Данная аннотация не обязательна для полей, снабженных следующими аннотациями пакета
javax.persistence
:@Column
,@OneToOne
,@OneToMany
,@ManyToOne
,@ManyToMany
,@Embedded
. Такие поля отражаются в метаданных автоматически. Поэтому@MetaProperty
в основном применяется для определения неперсистентных атрибутов сущностей.Параметры:
-
mandatory
- (необязательный параметр, по умолчаниюfalse
) - может ли атрибут содержатьnull
. При указанииmandatory = true
визуальные компоненты, работающие с данным атрибутом, могут сигнализировать пользователю о необходимости ввода значения.
Пример использования для поля:
@Transient @MetaProperty protected String token;
Пример использования для метода:
@MetaProperty public String getLocValue() { if (!StringUtils.isBlank(messagesPack)) { return AppBeans.get(Messsages.class).getMessage(messagesPack, value); } else { return value; } }
-
-
@OnDelete
-
Определяет политику обработки связи в случае мягкого удаления сущности, содержащей данный атрибут. См. Мягкое удаление.
Пример:
@OneToMany(mappedBy = "group") @OnDelete(DeletePolicy.CASCADE) private Set<Constraint> constraints;
-
@OnDeleteInverse
-
Определяет политику обработки связи в случае мягкого удаления сущности с обратной стороны ассоциации. См. Мягкое удаление.
Пример:
@ManyToOne @JoinColumn(name = "DRIVER_ID") @OnDeleteInverse(DeletePolicy.DENY) private Driver driver;
-
@Composition
-
Указывает на то, что связь является композицией - более тесным вариантом ассоциации. Это означает, что связанная сущность имеет смысл только как часть владеющей сущности, т.е. создается и удаляется вместе с ней.
Например, список пунктов в заказе (класс
Order
содержит коллекцию экземпляровItem
):@OneToMany(mappedBy = "order") @Composition protected List<Item> items;
Указание для связи аннотации
@Composition
позволяет организовать в экранах редактирования специальный режим коммита источников данных, при котором изменения экземпляров детализирующей сущности сохраняются в базе данных только при коммите основной сущности. Подробнее см. Редактирование композитных сущностей.
-
@LocalizedValue
-
Служит для описания способа получения локализованного значения некоторого изменяющегося атрибута, которое возвращает метод
MessageTools.getLocValue()
.Параметры:
-
messagePack
- явное указание пакета, из которого будет взято локализованное сообщение, например,com.haulmont.cuba.core.entity
-
messagePackExpr
- выражение в терминах пути к атрибуту, хранящему имя пакета, из которого будет взято локализованное сообщение, напримерproc.messagesPack
. Путь начинается с атрибута текущей сущности.
Пример аннотации, означающей, что локализованное значение атрибута
state
будет взято из пакета, имя которого хранится в атрибутеmessagesPack
связанной сущностиproc
:@Column(name = "STATE") @LocalizedValue(messagePackExpr = "proc.messagesPack") protected String state; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PROC_ID") protected Proc proc;
-
-
@IgnoreUserTimeZone
-
Для атрибутов типа timestamp с аннотацией
@javax.persistence.Temporal.TIMESTAMP
заставляет платформу игнорировать часовой пояс пользователя, если он задан для текущей сессии.