「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JPA の @MappedSuperclass を理解する

JPA の @MappedSuperclass を理解する

2024 年 9 月 2 日に公開
ブラウズ:309

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. テーブル car: メーカー、モデル、年、ドアの数量の列が含まれます。
  2. テーブル オートバイ: メーカー、モデル、年、TemSidecar の列が含まれます。

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

使用の利点 @MappedSuperclass

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

考慮事項

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

結論

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

リリースステートメント この記事は次の場所に転載されています: https://dev.to/gregoriohd/entendendo-mappedsuperclass-em-jpa-4310?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3