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