JPA の @MappedSuperclass を理解する

PHPz
リリース: 2024-08-25 18:00:36
オリジナル
1075 人が閲覧しました

Entendendo @MappedSuperclass em JPA

JPA (Java Persistence API) は、Java クラスをデータベース テーブルにマップするためのいくつかのアノテーションを提供します。このような便利なアノテーションの 1 つは @MappedSuperclass です。これは、プロパティが他のエンティティ クラスによって継承される必要があるが、エンティティ自体ではないクラスを指定するために使用されます。 Vehicle、Car、Motorcycle などのクラスを含む実際の例を通じて、このアノテーションの有用性を探ってみましょう。

@MappedSuperclass とは何ですか?

@MappedSuperclass アノテーションは、クラスが独立したエンティティであってはならず、その属性がエンティティである他のクラスによって継承される必要があることを示すために使用されます。これは、基本クラス用に別のテーブルを作成せずに、複数のエンティティ間で共通の属性を共有したい場合に便利です。

主な機能:

  1. - @MappedSuperclass の注釈が付けられたクラスはエンティティではありません。
  2. - @MappedSuperclass クラスに対してクエリを直接実行することはできません。
  3. - @MappedSuperclass クラスを拡張するサブクラスはデータベース内の個々のテーブルにマップされますが、基本クラスからフィールドを継承します。

実践例

Vehicle、Car、Motorcycle のクラス階層を持つ例を作成してみましょう。Vehicle がスーパークラスです。

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 と @GeneratedValue の注釈が付けられた id フィールドがあります。この一意の識別子はすべてのサブクラスによって継承され、Vehicle から派生した各エンティティが id フィールドを持つことが保証されます。
  • ブランド、モデル、年という 3 つの共通属性を定義します。

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
}
ログイン後にコピー
  • Motorcycle クラスは Vehicle クラスの属性も継承します。
  • これには @Entity の注釈が付けられ、motorcycle というテーブルにマッピングされます。

テーブルマッピング

上記のクラスを使用して、JPA はデータベースに次のテーブルを作成します。

  1. 車テーブル: メーカー、モデル、年式、ドアの数量の列が含まれます。
  2. テーブル オートバイ: メーカー、モデル、年、temSidecar の列が含まれます。

Vehicle クラスは単なるスーパークラスでありエンティティではないため、Vehicle テーブルはデータベースに存在しません。

使用の利点 @MappedSuperclass

  • 識別子の集中化: ID フィールドはスーパークラスで管理されます。 Vehicle から派生したすべてのエンティティは、同じ識別スキームを共有します。
  • コードの再利用: 共通の属性をスーパークラスに集中させて、サブクラスでの重複を回避できます。
  • メンテナンスの容易さ: 共通の属性への変更を 1 か所で行うことができます。
  • 結合データ モデル: サブクラスは同じ構造を共有するため、モデルの操作と理解が容易になります。

考慮事項

スーパークラスをエンティティにもしたい場合 (直接クエリなど)、@MappedSuperclass の代わりに @Inheritance 継承戦略を使用します。
@MappedSuperclass は、基本クラスを個別のエンティティとして永続化する必要はないが、そのプロパティが複数のエンティティに関連する状況に最適です。

結論

@MappedSuperclass アノテーションは、JPA で再利用可能なクラス階層を作成するための強力なツールです。上の例では、Vehicle の共通属性を一元化すると同時に、Car エンティティと Motorcycle エンティティの柔軟性と独立性を維持することができました。このアプローチは、特に同様の特性を共有する複数のエンティティを含むシステムにおいて、よりクリーンでよりモジュール化された設計を促進します。

以上がJPA の @MappedSuperclass を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!