Как я объяснил в этой статье , @MappedSupperclass
отличается от аннотации @Inheritance
.
@MappedSuperclass
говорит провайдеру JPA включить постоянные свойства базового класса, как если бы они были объявлены дочерним классом, расширяющим суперкласс с аннотацией @MappedSuperclass
.
Однако наследование видно только в мире ООП, поскольку с точки зрения базы данных нет указаний на базовый класс. Только сущность дочернего класса будет иметь связанную сопоставленную таблицу.
Аннотация @Inheritance
предназначена для материализации модели наследования ООП в структуре таблицы базы данных. Более того, вы можете запросить базовый класс, аннотированный @Inheritance
, но вы не можете сделать это для базового класса, аннотированного @MappedSuperclass
.
Теперь причина, по которой вы хотите использовать аннотацию JPA @Inheritance
, заключается в реализации шаблонов, основанных на поведении, таких как шаблон стратегии .
С другой стороны, @MappedSuperclass
- это просто способ многократного использования как базовых свойств, ассоциаций, так и даже сущности @Id
с использованием общего базового класса. Тем не менее, вы можете достичь почти той же цели, используя тип @Embeddable
. Единственное существенное отличие состоит в том, что вы не можете повторно использовать определение @Id
с @Embeddable
, но вы можете сделать это с @MappedSuperclass
.