首頁  >  文章  >  Java  >  理解 JPA 中的 @MappedSuperclass

理解 JPA 中的 @MappedSuperclass

PHPz
PHPz原創
2024-08-25 18:00:361079瀏覽

Entendendo @MappedSuperclass em JPA

JPA(Java Persistence API)提供了多個註解來將 Java 類別對應到資料庫表。一個這樣有用的註解是@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 欄位以 @id 和 @GenerateValue 註解。這個唯一識別碼將被所有子類別繼承,確保從Vehicle派生的每個實體都有一個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
}
  • Motorcycle 類別也繼承了 Vehicle 類別的屬性。
  • 它用@Entity註解並對應到一個名為motorcycle的表。

表格映射

使用上述類,JPA 將在資料庫中建立以下表:

  1. 汽車表:包含品牌、型號、年份和數量門的欄位。
  2. 摩托車:包含品牌、型號、年份和 temSidecar 欄位。

Vehicle 表在資料庫中不存在,因為 Vehicle 類別只是一個超類,而不是實體。

使用 @MappedSuperclass

的好處
  • 標識符集中化:id欄位在超類別中管理。源自車輛的所有實體共享相同的識別方案。
  • 程式碼重複使用:公共屬性可以集中在超類別中,避免子類別中的重複。
  • 易於維護:可以在一個地方對公共屬性進行更改。
  • 內聚資料模型:子類別共享相同的結構,這使得模型更易於操作和理解。

注意事項

如果您希望超類別也是一個實體(例如用於直接查詢),請使用@Inheritance繼承策略而不是@MappedSuperclass。
@MappedSuperclass 非常適合基底類別不需要作為單一實體持久化,但其屬性與多個實體相關的情況。

結論

@MappedSuperclass 註解是在 JPA 中建立可重複使用類別層次結構的強大工具。在上面的範例中,我們設法集中了車輛中的公共屬性,同時保持了汽車和摩托車實體的靈活性和獨立性。這種方法促進了更清晰、更模組化的設計,特別是在具有共享相似特徵的多個實體的系統中。

以上是理解 JPA 中的 @MappedSuperclass的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:遞迴-1下一篇:遞迴-1