«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Понимание @MappedSuperclass в JPA

Понимание @MappedSuperclass в JPA

Опубликовано 2 сентября 2024 г.
Просматривать:464

Entendendo @MappedSuperclass em JPA

JPA (Java Persistence API) предоставляет несколько аннотаций для сопоставления классов Java с таблицами базы данных. Одной из таких полезных аннотаций является @MappedSuperclass, которая используется для обозначения класса, свойства которого должны наследоваться другими классами сущностей, но который сам по себе не является сущностью. Давайте рассмотрим полезность этой аннотации на практическом примере, включающем такие классы, как Транспортное средство, Автомобиль и Мотоцикл.

Что такое @MappedSuperclass?

Аннотация @MappedSuperclass используется для указания того, что класс не должен быть независимой сущностью, но что его атрибуты должны наследоваться другими классами, которые являются сущностями. Это полезно, если вы хотите использовать общие атрибуты для нескольких сущностей без создания отдельной таблицы для базового класса.

Основные возможности:

  1. — Класс, помеченный @MappedSuperclass, не является сущностью.
  2. — невозможно выполнять запросы непосредственно к классу @MappedSuperclass.
  3. — Подклассы, расширяющие класс @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

}
  • Класс Vehicle имеет аннотацию @MappedSuperclass.
  • Класс Vehicle имеет поле id, аннотированное @id и @GeneratedValue. Этот уникальный идентификатор будет унаследован всеми подклассами, гарантируя, что каждый объект, полученный из транспортного средства, имеет поле id.
  • Он определяет три общих атрибута: бренд, модель и год.

2. Подкласс: Автомобиль

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "carro")
public class Carro extends Veiculo {

    private int quantidadePortas;

    // Getters e Setters

}
  • Класс Car наследует атрибуты класса Vehicle.
  • Он аннотирован @Entity и сопоставлен с таблицей с именем car.

3. Подкласс: Мотоцикл

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "motocicleta")
public class Motocicleta extends Veiculo {

    private boolean temSidecar;

    // Getters e Setters
}
  • Класс Мотоцикл также наследует атрибуты класса Транспортное средство.
  • Он снабжен аннотацией @Entity и сопоставлен с таблицей мотоцикла.

Сопоставление таблиц

С помощью указанных выше классов JPA создаст в базе данных следующие таблицы:

  1. Таблица автомобиль: содержит столбцы с указанием марки, модели, года и количества дверей.
  2. Таблица мотоцикл: содержит столбцы с маркой, моделью, годом и типом коляски.

Таблица Vehicle не существует в базе данных, поскольку класс Vehicle является просто суперклассом, а не сущностью.

Преимущества использования @MappedSuperclass

  • Централизация идентификаторов: поле id управляется в суперклассе. Все объекты, производные от Транспортное средство используют одну и ту же схему идентификации.
  • Повторное использование кода: общие атрибуты можно централизовать в суперклассе, избегая дублирования в подклассах.
  • Простота обслуживания: изменения общих атрибутов можно вносить в одном месте.
  • Связная модель данных: подклассы имеют одну и ту же структуру, что упрощает манипулирование и понимание модели.

Соображения

Если вы хотите, чтобы суперкласс также был сущностью (например, для прямых запросов), используйте стратегию наследования @Inheritance вместо @MappedSuperclass.
@MappedSuperclass идеально подходит для ситуаций, когда базовый класс не требуется сохранять как отдельный объект, но его свойства относятся к нескольким объектам.

Заключение

Аннотация @MappedSuperclass — это мощный инструмент для создания повторно используемых иерархий классов в JPA. В приведенном выше примере нам удалось централизовать общие атрибуты в Транспортном средстве и в то же время сохранить гибкость и независимость сущностей Автомобиль и Мотоцикл. Этот подход обеспечивает более чистый и модульный дизайн, особенно в системах с несколькими объектами, имеющими схожие характеристики.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/gregoriohd/entendendo-mappedsuperclass-em-jpa-4310?1. В случае нарушения авторских прав свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3