Rumah >Java >javaTutorial >Memahami @MappedSuperclass dalam JPA

Memahami @MappedSuperclass dalam JPA

PHPz
PHPzasal
2024-08-25 18:00:361112semak imbas

Entendendo @MappedSuperclass em JPA

JPA (Java Persistence API) menyediakan beberapa anotasi untuk memetakan kelas Java ke jadual pangkalan data. Satu anotasi yang berguna ialah @MappedSuperclass, yang digunakan untuk menetapkan kelas yang sifatnya mesti diwarisi oleh kelas entiti lain, tetapi yang bukan entiti itu sendiri. Mari kita terokai kegunaan anotasi ini melalui contoh praktikal yang melibatkan kelas seperti Kenderaan, Kereta dan Motosikal.

Apakah itu @MappedSuperclass?

Anotasi @MappedSuperclass digunakan untuk menunjukkan bahawa kelas tidak seharusnya menjadi entiti bebas, tetapi atributnya harus diwarisi oleh kelas lain yang merupakan entiti. Ini berguna apabila anda ingin berkongsi atribut biasa antara berbilang entiti tanpa membuat jadual berasingan untuk kelas asas.

Ciri utama:

  1. - Kelas yang dianotasi dengan @MappedSuperclass bukan entiti.
  2. - Tidak mungkin untuk melaksanakan pertanyaan secara langsung pada kelas @MappedSuperclass.
  3. - Subkelas yang melanjutkan kelas @MappedSuperclass dipetakan ke jadual individu dalam pangkalan data, tetapi mewarisi medan daripada kelas asas.

Contoh Praktikal

Mari kita buat contoh dengan hierarki kelas untuk Kenderaan, Kereta dan Motosikal, dengan Kenderaan ialah kelas super.

1. Kelas Asas: Kenderaan

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

}
  • Kelas Kenderaan diberi anotasi dengan @MappedSuperclass.
  • Kelas Kenderaan mempunyai medan id beranotasi dengan @id dan @GeneratedValue. Pengecam unik ini akan diwarisi oleh semua subkelas, memastikan setiap entiti yang diperoleh daripada Kenderaan mempunyai medan id.
  • Ia mentakrifkan tiga atribut biasa: jenama, model dan tahun.

2. Subkelas: Kereta

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

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

    private int quantidadePortas;

    // Getters e Setters

}
  • Kelas Kereta mewarisi atribut kelas Kenderaan.
  • Ia dianotasi dengan @Entity dan dipetakan ke jadual yang dipanggil kereta.

3. Subkelas: Motosikal

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

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

    private boolean temSidecar;

    // Getters e Setters
}
  • Kelas Motosikal juga mewarisi sifat-sifat kelas Kenderaan.
  • Ia dianotasi dengan @Entity dan dipetakan ke meja yang dipanggil motosikal.

Pemetaan Jadual

Dengan kelas di atas, JPA akan mencipta jadual berikut dalam pangkalan data:

  1. Meja Kereta: Mengandungi lajur untuk pembuatan, model, tahun dan kuantitiPintu.
  2. Meja motosikal: Mengandungi lajur untuk pembuatan, model, tahun dan temSidecar.

Jadual Vehicle tidak wujud dalam pangkalan data, kerana kelas Vehicle hanyalah superclass dan bukan entiti.

Faedah menggunakan @MappedSuperclass

  • Pemusatan Pengecam: Medan id diurus dalam superclass. Semua entiti yang diperoleh daripada Kenderaan berkongsi skim pengenalan yang sama.
  • Guna Semula Kod: Atribut biasa boleh dipusatkan dalam kelas super, mengelakkan pertindihan dalam subkelas.
  • Kemudahan Penyelenggaraan: Perubahan pada atribut biasa boleh dibuat di satu tempat.
  • Model Data Kohesif: Subkelas berkongsi struktur yang sama, yang menjadikan model lebih mudah untuk dimanipulasi dan difahami.

Pertimbangan

Jika anda mahu superclass juga menjadi entiti (cth. untuk pertanyaan langsung), gunakan strategi warisan @Inheritance dan bukannya @MappedSuperclass.
@MappedSuperclass sesuai untuk situasi di mana kelas asas tidak perlu dikekalkan sebagai entiti individu, tetapi sifatnya berkaitan dengan berbilang entiti.

Kesimpulan

Anotasi @MappedSuperclass ialah alat yang berkuasa untuk mencipta hierarki kelas boleh guna semula dalam JPA. Dalam contoh di atas, kami berjaya memusatkan atribut biasa dalam Kenderaan dan, pada masa yang sama, mengekalkan fleksibiliti dan kebebasan entiti Kereta dan Motosikal. Pendekatan ini menggalakkan reka bentuk yang lebih bersih dan lebih modular, terutamanya dalam sistem dengan berbilang entiti yang berkongsi ciri yang serupa.

Atas ialah kandungan terperinci Memahami @MappedSuperclass dalam JPA. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Rekursi -1Artikel seterusnya:Rekursi -1