4.2.1.1. Базовые классы сущностей
Рассмотрим базовые классы и интерфейсы сущностей более подробно.
-
Instance– декларирует базовые методы работы с объектами предметной области:-
Получение глобального уникального идентификатора (UUID) сущности.
-
Получение ссылки на мета-класс объекта.
-
Генерация имени экземпляра.
-
Чтение/установка значений атрибутов по имени.
-
Добавление слушателей, получающих уведомления об изменениях атрибутов.
-
-
Entity– дополняетInstanceпонятием идентификатора сущности (который не обязательно равен UUID), причемEntityне определяет тип идентификатора, оставляя эту возможность наследникам. -
AbstractInstance– реализует логику работы со слушателями изменения атрибутов.WarningAbstractInstanceхранит слушателей в коллекции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.