首頁  >  文章  >  Java  >  JPA 和 Hibernate 中的「MappedBy」如何協助管理雙向關係並提高資料庫模式的簡單性?

JPA 和 Hibernate 中的「MappedBy」如何協助管理雙向關係並提高資料庫模式的簡單性?

Patricia Arquette
Patricia Arquette原創
2024-11-03 13:01:30878瀏覽

How does `MappedBy` in JPA and Hibernate help manage bidirectional relationships and improve database schema simplicity?

了解JPA 和Hibernate 中的MappedBy

MappedBy 在管理Java Persistence API (JPA) 和Hibernate 中物件對應關係的雙向關係方面發揮著至關重要的關係作用。這是在資料庫上下文中建模和導航複雜關係的實用方法。

MappedBy 的建議用法

在您的具體示例中,航空公司擁有許多 AirlineFlight,並且許多 AirlineFlight 屬於一家航空公司、mappedBy用於避免重複資訊儲存。由於您希望AirlineFlights成為擁有的類,因此您在Airline類中指定mappedBy屬性:

<code class="java">@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinColumn(name="IDAIRLINE")
public Set<AirlineFlight> getAirlineFlights() {
    return airlineFlights;
}</code>

@OneToMany註解中的mappedBy參數指定AirlineFlights表中的IDAIRLINE欄位是外鍵對應回航空公司表中的主鍵。這樣,當您查詢 Airline 物件時,您也可以輕鬆取得其關聯的 AirlineFlights。

MappedBy 的用途

MappedBy 有幾個重要用途:

  • 防止SQL 聯結複製資訊:如果🎜>
  • 防止SQL 連線之間的聯結將同時包含IDAIRLINE 主鍵和AirlineFlights 表中的外鍵。這可能會導致資料重複和效能問題。
  • 提高資料庫架構簡單性:
  • 透過使用mappedBy,您可以確保只有一個表包含外鍵,從而形成更簡單、更規範的資料庫schema.
  • 支援雙向導航:
  • 它允許您在兩個方向上遍歷關係(從Airline 到AirlineFlights,反之亦然),而無需編寫明確連接查詢。

您的特定場景

在您的範例中,AirplaneFlights 資料表將 IDAIRLINE 欄位作為指向 Airline 資料表的外鍵,但 Airline 資料表沒有對應的 IDAIRLINEFLIGHTS 欄位。此設定表示 AirlineFlights 是擁有實體,即使您的要求是讓 Airline 作為所有者。

要解決此問題,您需要相應地調整註釋。 AirlinesFlights 上的@OneToMany 註解應移至AirlineFlight 類,且mappedBy 屬性應引用Airline 類別中的「擁有」欄位:
<code class="java">@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="IDAIRLINE", nullable=false)
@MapsId
public Airline getAirline() {
    return airline;
}</code>

透過指定mappedBy 和@MapsId,您表明Airline 的主鍵(不是AirlineFlights中的IDAIRLINE 外鍵)用於定義關係。這將確保航空公司是擁有實體,並且可以根據需要急切或延遲地獲取。

以上是JPA 和 Hibernate 中的「MappedBy」如何協助管理雙向關係並提高資料庫模式的簡單性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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