JPA (Java Persistence API) предоставляет несколько аннотаций для сопоставления классов Java с таблицами базы данных. Одной из таких полезных аннотаций является @MappedSuperclass, которая используется для обозначения класса, свойства которого должны наследоваться другими классами сущностей, но который сам по себе не является сущностью. Давайте рассмотрим полезность этой аннотации на практическом примере, включающем такие классы, как Транспортное средство, Автомобиль и Мотоцикл.
Что такое @MappedSuperclass?
Аннотация @MappedSuperclass используется для указания того, что класс не должен быть независимой сущностью, но что его атрибуты должны наследоваться другими классами, которые являются сущностями. Это полезно, если вы хотите использовать общие атрибуты для нескольких сущностей без создания отдельной таблицы для базового класса.
Основные возможности:
Практический пример
Давайте создадим пример с иерархией классов «Транспортное средство», «Автомобиль» и «Мотоцикл», где «Транспортное средство» является суперклассом.
1. Базовый класс: Транспортное средство
import javax.persistence.MappedSuperclass; @MappedSuperclass public abstract class Veiculo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String marca; private String modelo; private int ano; // Getters e Setters }
2. Подкласс: Автомобиль
import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name = "carro") public class Carro extends Veiculo { private int quantidadePortas; // Getters e Setters }
3. Подкласс: Мотоцикл
import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name = "motocicleta") public class Motocicleta extends Veiculo { private boolean temSidecar; // Getters e Setters }
Сопоставление таблиц
С помощью указанных выше классов JPA создаст в базе данных следующие таблицы:
Таблица Vehicle не существует в базе данных, поскольку класс Vehicle является просто суперклассом, а не сущностью.
Преимущества использования @MappedSuperclass
Соображения
Если вы хотите, чтобы суперкласс также был сущностью (например, для прямых запросов), используйте стратегию наследования @Inheritance вместо @MappedSuperclass.
@MappedSuperclass идеально подходит для ситуаций, когда базовый класс не требуется сохранять как отдельный объект, но его свойства относятся к нескольким объектам.
Заключение
Аннотация @MappedSuperclass — это мощный инструмент для создания повторно используемых иерархий классов в JPA. В приведенном выше примере нам удалось централизовать общие атрибуты в Транспортном средстве и в то же время сохранить гибкость и независимость сущностей Автомобиль и Мотоцикл. Этот подход обеспечивает более чистый и модульный дизайн, особенно в системах с несколькими объектами, имеющими схожие характеристики.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3