4.2.1.1. Базовые классы сущностей

Рассмотрим базовые классы и интерфейсы сущностей более подробно.

Рисунок 4.5. Базовые классы сущностей

Базовые классы сущностей

  • 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.