7. Что такое Mapped Superclass?

7. Что такое Mapped Superclass?

Unknown

Mapped Superclass (сопоставленный суперкласс) - это класс, от которого наследуются Entity, он может содержать аннотации JPA, однако сам такой класс не является Entity, ему не обязательно выполнять все требования, установленные для Entity (например, он может не содержать первичного ключа). Эти суперклассы чаще всего используются, когда у нас есть общая для нескольких классов сущностей информация о состоянии и отображении, которую можно вынести в Mapped Superclass.

Особенности Mapped Superclass

  • Должен быть помечен аннотацией @MappedSuperclass или описан в xml файле.
  • Не может использоваться в операциях EntityManager или Query, вместо этого нужно использовать классы-наследники.
  • Не может состоять в отношениях с другими сущностями (в сущности нельзя создать поле с типом сопоставленного суперкласса).
  • Может быть абстрактным.
  • Не имеет своей таблицы в БД.

Для того, чтобы использовать Mapped Superclass, достаточно унаследовать его в классах-потомках:

@MappedSuperclass

public class Employee {

@Id

@GeneratedValue

private long id;

private String name;

.............

}

@Entity

@Table(name = "FULL_TIME_EMP")

public class FullTimeEmployee extends Employee {

private int salary;

.............

}

@Entity

@Table(name = "PART_TIME_EMP")

public class PartTimeEmployee extends Employee {

private int hourlyRate;

.............

}

В указанном примере кода в БД будут таблицы FULLTIMEEMPLOYEE и PARTTIMEEMPLOYEE, но таблицы EMPLOYEE не будет:


Это похоже на стратегию наследования "Таблица для каждого конкретного класса сущностей", но в модели данных нет объединения таблиц или наследования.

Также тут нет таблицы для Mapped Superclass. Наследование существует только в объектной модели.

Основным недостатком использования сопоставленного суперкласса является то, что полиморфные запросы невозможны, то есть мы не можем загрузить всех наследников Mapped Superclass.

Mapped Superclass vs. Embeddable class

Сходства:

  • не являются сущностями и могут иметь все аннотации, кроме @Entity;
  • не имеют своих таблиц в БД;
  • не могут использоваться в операциях EntityManager или Query.

Различия:

  • MappedSuperclass - наследование, Embeddable class - композиция (экземпляр «части» может входить только в одно целое (или никуда не входить));
  • поля из Mapped Superclass могут быть у сущности в одном экземпляре, полей из Embeddable class может быть сколько угодно (встроив в сущность Embeddable class несколько раз и поменяв имена полей);
  • в сущности нельзя создать поле с типом сопоставленного суперкласса, а с Embeddable можно и нужно.

Предыдущий вопрос: 6. Что такое встраиваемый (Embeddable) класс? Какие требования JPA предъявляет к встраиваемым (Embeddable) классам?

Следующий вопрос: 8. Какие три стратегии маппинга при наследовании сущностей (Entity Inheritance Mapping Strategies) описаны в JPA?

Все вопросы по теме: список

Все темы: список

Вопросы/замечания/предложения/нашли ошибку: напишите мне


Report Page