:sourcesdir: ../../../../../../source

[[entity_class_annotations]]
====== Аннотации класса

++++
<div class="manual-live-demo-container">
    <a href="http://docs.oracle.com/javaee/7/api/javax/persistence/Embeddable.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[embeddable_annotation]]
@Embeddable::
+
--
Определяет встраиваемую сущность, экземпляры которой хранятся вместе с владеющей сущностью в той же таблице.

Для задания имени сущности требуется применение аннотации <<metaclass_annotation,@MetaClass>>.
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/cuba/core/entity/annotation/EnableRestore.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[enableRestore_annotation]]
@EnableRestore::
Указывает, что экземпляры данной сущности доступны для восстановления после <<soft_deletion,мягкого удаления>> в специальном экране `core$Entity.restore`, доступном через пункт *Administration > Data Recovery* главного меню.

++++
<div class="manual-live-demo-container">
    <a href="http://docs.oracle.com/javaee/7/api/javax/persistence/Entity.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[entity_annotation]]
@Entity::
+
--
Объявляет класс сущностью модели данных.

Параметры:

* `name` - имя сущности, обязательно должно начинаться с префикса, отделенного знаком `_`. Желательно использовать в качестве префикса короткое имя проекта для формирования отдельного пространства имен.

Пример:

[source, java]
----
@Entity(name = "sales_Customer")
----
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/cuba/core/entity/annotation/Extends.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[extends_annotation]]
@Extends::
Указывает, что данная сущность является расширением и должна повсеместно использоваться вместо базовой. См. <<extension,Расширение функциональности>>.

++++
<div class="manual-live-demo-container">
    <a href="http://docs.oracle.com/javaee/7/api/javax/persistence/DiscriminatorColumn.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[discriminatorColumn_annotation]]
@DiscriminatorColumn::
+
--
Используется для определения колонки БД, отвечающей за различение типов сущностей в случае стратегий наследования `++SINGLE_TABLE++` и `JOINED`.

Параметры:

* `name` - имя колонки-дискриминатора

* `discriminatorType` - тип данных колонки-дискриминатора

Пример:

[source, java]
----
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.INTEGER)
----
--

++++
<div class="manual-live-demo-container">
    <a href="http://docs.oracle.com/javaee/7/api/javax/persistence/DiscriminatorValue.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[discriminatorValue_annotation]]
@DiscriminatorValue::
+
--
Определяет значение колонки-дискриминатора для данной сущности. Эта аннотация должна быть помещена на конкретном классе сущности.

Пример:

[source, java]
----
@DiscriminatorValue("0")
----
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/cuba/core/entity/annotation/IdSequence.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[idsequence_annotation]]
@IdSequence::
+
--
Явно задает имя последовательности базы данных, используемой для генерации идентификаторов сущности, если она является подклассом `BaseLongIdEntity` или `BaseIntegerIdEntity`. Если сущность не аннотирована, то фреймворк создает последовательность с автоматически сгенерированным именем.

Параметры:

* `name` – имя последовательности.
* `cached` - необязательный параметр, определяющий что последовательность должена инкрементироваться через <<cuba.numberIdCacheSize,cuba.numberIdCacheSize>> для кэширования промежуточных значений в памяти. По умолчанию false.
--

++++
<div class="manual-live-demo-container">
    <a href="http://docs.oracle.com/javaee/7/api/javax/persistence/Inheritance.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++


[[inheritance_annotation]]
@Inheritance::
+
--
Определяет стратегию наследования для иерархии классов сущностей. Данная аннотация должна быть помещена на корневом классе иерархии.

Параметры:

* `strategy` - стратегия, по умолчанию `++SINGLE_TABLE++`
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/cuba/core/entity/annotation/Listeners.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[listeners_annotation]]
@Listeners::
+
--
Определяет список слушателей, предназначенных для реакции на события жизненного цикла экземпляров сущности на <<app_tiers,уровне>> Middleware.

Значением аннотации должна быть строка или массив строк с именами бинов слушателей - см. <<entity_listeners,Entity Listeners>>.

Примеры:

[source, java]
----
@Listeners("sample_UserEntityListener")
----

[source, java]
----
@Listeners({"sample_FooListener","sample_BarListener"})
----
--

++++
<div class="manual-live-demo-container">
    <a href="http://docs.oracle.com/javaee/7/api/javax/persistence/MappedSuperclass.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[mappedSuperclass_annotation]]
@MappedSuperclass::
+
--
Определяет, что данный класс является предком некоторых сущностей, и его атрибуты должны быть использованы в составе сущностей-наследников. Такой класс не сопоставляется никакой отдельной таблице БД.

[TIP]
====
Руководство https://www.cuba-platform.com/guides/data-modelling-entity-inheritance[Data Modelling: Entity Inheritance] демонстрирует механизм наследования сущностей.
====
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/chile/core/annotations/MetaClass.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[metaclass_annotation]]
@MetaClass::
+
--
Используется для объявления неперсистентной или <<embeddable_annotation,встраиваемой>> сущности (т.е. когда аннотация `@javax.persistence.Entity` не применима)

Параметры:

* `name` - имя сущности, обязательно должно начинаться с префикса, отделенного знаком `_`. Желательно использовать в качестве префикса короткое имя проекта для формирования отдельного пространства имен.

Пример:

[source, java]
----
@MetaClass(name = "sales_Customer")
----
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/chile/core/annotations/NamePattern.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[namePattern_annotation]]
@NamePattern::
+
--
Определяет способ получения имени экземпляра, т.е. строки, которая представляет экземпляр сущности. Имя экземпляра можно описать как метод `toString()` прикладного уровня. Он повсеместно используется в UI при отображении экземпляров сущностей в отдельных полях подобных `TextField` или `LookupField`. Кроме того, имя экземпляра можно получить программно методом `MetadataTools.getInstanceName()`.

Значением аннотации должна быть строка вида `{0}|{1}`, где:

* `{0}` - строка форматирования, которая может быть одной из следующих двух типов:
** Строка с символами `%s` для подстановки форматированных значений атрибутов. Значения форматируются в строки в соответствии с <<datatype,datatypes>> атрибутов.
** Имя метода данного объекта с префиксом `#`. Метод должен возвращать `String` и не иметь параметров.

* `{1}` - разделенный запятыми список имен атрибутов сущности, соответствующий формату `{0}`. В случае использования в `{0}` метода список полей все равно необходим, так как по нему формируется <<views,представление>> `_minimal`.

Примеры:

[source, java]
----
@NamePattern("%s|name")
----

[source, java]
----
@NamePattern("%s - %s|name,date")
----

[source, java]
----
@NamePattern("#getCaption|login,name")
----
--

++++
<div class="manual-live-demo-container">
    <a href="https://docs.oracle.com/javaee/7/api/javax/annotation/PostConstruct.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[postConstruct_entity_annotation]]
@PostConstruct::
+
--
Данная аннотация может быть указана для метода класса. Такой метод будет вызван сразу после создания экземпляра сущности методом <<metadata,Metadata.create()>> или аналогичными методами `DataManager.create()` и `DataContext.create()`.

[TIP]
====
В руководстве https://www.cuba-platform.com/guides/initial-entity-values[Initial Entity Values] приводится пример определения начального значения непосредственно в классе сущности с помощью аннотации `@PostConstruct`.
====

Аннотированный метод может принимать в качестве параметров Spring-бины, доступные в модуле `global`. Например:

[source,java]
----
@PostConstruct
public void postConstruct(Metadata metadata, SomeBean someBean) {
    // ...
}
----
--

++++
<div class="manual-live-demo-container">
    <a href="https://docs.oracle.com/javaee/7/api/javax/persistence/PrimaryKeyJoinColumn.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[primaryKeyJoinColumn_annotation]]
@PrimaryKeyJoinColumn::
+
--
Используется в случае стратегии наследования `JOINED` для указания колонки внешнего ключа данной сущности, ссылающегося на первичный ключ сущности-предка.

Параметры:

* `name` - имя колонки внешнего ключа данной сущности

* `referencedColumnName` - имя колонки первичного ключа сущности предка

Пример:

[source, java]
----
@PrimaryKeyJoinColumn(name = "CARD_ID", referencedColumnName = "ID")
----
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/cuba/core/entity/annotation/PublishEntityChangedEvents.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[publishEntityChangedEvents_annotation]]
@PublishEntityChangedEvents::
Указывает, что когда данная сущность изменяется в базе данных, фреймворк должен посылать <<entityChangedEvent,EntityChangedEvent>>.

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/cuba/core/entity/annotation/SystemLevel.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[systemLevel_annotation]]
@SystemLevel::
Указывает, что данная сущность является системной и не должна быть доступна для выбора пользователем в различных списках сущностей, например, как тип параметра универсального фильтра или тип <<dynamic_attributes,динамического атрибута>>.

++++
<div class="manual-live-demo-container">
    <a href="https://docs.oracle.com/javaee/7/api/javax/persistence/Table.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[table_annotation]]
@Table::
+
--
Определяет таблицу базы данных для данной сущности. 

Параметры:

* `name` - имя таблицы

Пример:

[source, java]
----
@Table(name = "SALES_CUSTOMER")
----
--

++++
<div class="manual-live-demo-container">
    <a href="http://files.cuba-platform.com/javadoc/cuba/7.2/com/haulmont/cuba/core/entity/annotation/TrackEditScreenHistory.html" class="api-docs-btn" target="_blank">API DOCS</a>
</div>
++++

[[trackEditScreenHistory_annotation]]
@TrackEditScreenHistory::
Указывает, что для данной сущности будет запоминаться история открытия экранов редактирования (`++{имя_сущности}.edit++`) с возможностью отображения в специальном экране `sec$ScreenHistory.browse`, который можно подключить к главному меню с помощью следующего элемента <<menu.xml,web-menu.xml>>:
[source, xml]
----
<item id="sec$ScreenHistory.browse" insertAfter="settings"/>
----
