4.2.1.1. Базовые классы сущностей
Рассмотрим базовые классы и интерфейсы сущностей более подробно.
-
Instance
– декларирует базовые методы работы с объектами предметной области:-
Получение ссылки на мета-класс объекта.
-
Генерация имени экземпляра.
-
Чтение/установка значений атрибутов по имени.
-
Добавление слушателей, получающих уведомления об изменениях атрибутов.
-
-
Entity
– дополняетInstance
понятием идентификатора сущности, причемEntity
не определяет тип идентификатора, оставляя эту возможность наследникам. -
AbstractInstance
– реализует логику работы со слушателями изменения атрибутов.WarningAbstractInstance
хранит слушателей в коллекцииWeakReference
, т.е. при отсутствии внешних ссылок на добавленного слушателя, он будет немедленно уничтожен сборщиком мусора. Как правило, слушателями изменения атрибутов являются визуальные компоненты и источники данных UI, на которые всегда имеются ссылки из других объектов, поэтому проблема исчезновения слушателей не возникает. Однако если слушатель создается прикладным кодом и на него никто не ссылается естественным образом, необходимо кроме добавления вInstance
сохранить его в некотором поле объекта. -
AbstractNotPersistentEntity
– базовый класс неперсистентных сущностей. -
BaseGenericIdEntity
- базовый класс персистентных сущностей. РеализуетEntity
, но не специфицирует тип идентификатора (то есть первичного ключа) сущности. -
EmbeddableEntity
- базовый класс персистентных встраиваемых сущностей.
Ниже рассмотрены базовые классы, от которых рекомендуется наследовать сущности.
- StandardEntity
-
Наследуйте от
StandardEntity
, если необходим стандартный набор свойств сущности: первичный ключ типа UUID, экземпляры должны содержать информацию о том, кто и когда создал и изменил их, необходима оптимистичная блокировка и мягкое удаление.-
HasUuid
– интерфейс сущностей имеющих глобальные уникальные идентификаторы -
Versioned
– интерфейс сущностей, поддерживающих оптимистичную блокировку -
Creatable
– интерфейс сущностей, для которых требуется сохранять информацию о том, кто и когда ее создал -
Updatable
– интерфейс сущностей, для которых требуется сохранять информацию о том, кто и когда изменял экземпляр в последний раз -
SoftDelete
– интерфейс сущностей, поддерживающих мягкое удаление
-
- BaseUuidEntity
-
Наследуйте от
BaseUuidEntity
если необходима сущность с идентификатором типа UUID, но не нужны все остальные свойстваStandardEntity
. ИнтерфейсыCreatable
,Versioned
и др. можно выборочно реализовать в конкретном классе сущности. - BaseLongIdEntity
-
Наследуйте от
BaseLongIdEntity
илиBaseIntegerIdEntity
если необходима сущность с идентификатором типаLong
илиInteger
. ИнтерфейсыCreatable
,Versioned
и др. можно выборочно реализовать в конкретном классе сущности. Рекомендуется реализоватьHasUuid
, так как это позволяет платформе в некоторых случаях работать с сущностью более оптимально, а кроме того, сущность получает уникальный идентификатор в распределенном окружении. - BaseStringIdEntity
-
Наследуйте от
BaseStringIdEntity
если необходима сущность с идентификатором типаString
. ИнтерфейсыCreatable
,Versioned
и др. можно выборочно реализовать в конкретном классе сущности. Рекомендуется реализоватьHasUuid
, так как это позволяет платформе в некоторых случаях работать с сущностью более оптимально, а кроме того, сущность получает уникальный идентификатор в распределенном окружении. В конкретном классе сущности, унаследованной отBaseStringIdEntity
, необходимо задать атрибут-идентификатор типаString
и добавить ему JPA-аннотацию@Id
. - BaseIdentityIdEntity
-
Наследуйте от
BaseIdentityIdEntity
если необходимо отобразить сущность на таблицу с первичным ключом типа IDENTITY. ИнтерфейсыCreatable
,Versioned
и др. можно выборочно реализовать в конкретном классе сущности. Рекомендуется реализоватьHasUuid
, так как это позволяет платформе в некоторых случаях работать с сущностью более оптимально, а кроме того, сущность получает уникальный идентификатор в распределенном окружении. Атрибутid
сущности (т.е. методы getId/setId) будут иметь типIdProxy
, который предназначен для использования вместо реального идентификатора, пока он не сгенерирован базой данных на вставке записи. - BaseGenericIdEntity
-
Наследуйте напрямую от
BaseGenericIdEntity
если необходимо отобразить сущность на таблицу с композитным первичным ключом. В этом случае в классе сущности необходимо создать поле встраиваемого типа, представляющего композитный ключ, и аннотировать его JPA-аннотацией@EmbeddedId
.