(快速參考)

mappedBy

目的

mappedBy 靜態屬性讓您可以控制關聯是對應為單向或雙向,以及在雙向關聯的情況下,哪些屬性形成反向。

範例

在此範例中,Airport 類別定義了兩個雙向的一對多關聯。如果沒有定義 mappedBy,這是不可行的,因為 GORM 無法區分關聯另一端的兩個屬性(Route 類別中的 departureAirportdestinationAirport)中的哪一個一對多應該關聯。

解決方案是定義 mappedBy,告訴 Airport 類別每個關聯如何與另一方關聯。

class Airport {

    static mappedBy = [outgoingFlights: 'departureAirport',
                       incomingFlights: 'destinationAirport']

    static hasMany = [outgoingFlights: Route,
                      incomingFlights: Route]
}
class Route {
    Airport departureAirport
    Airport destinationAirport
}

多對一關係的單獨範例

class Person {
    String name
    Person parent

    static belongsTo = [ supervisor: Person ]

    static mappedBy = [ supervisor: "none", parent: "none" ]

    static constraints = { supervisor nullable: true }
}

說明

Grails 需要知道關聯是單向或雙向,以及在後者的情況下,雙方涉及哪些屬性。它通常可以推斷出這些資訊,但當有多個具有相同類型的屬性時,它的猜測有時可能會錯誤。mappedBy 屬性是屬性名稱對的簡單映射,其中金鑰是目前網域名稱類別中關聯屬性的名稱,而值是關聯另一側網域名稱類別中關聯屬性的名稱(可能是它本身)。上述範例應能釐清這一點。

您也可以在映射中指定值為「none」,表示關聯是單向的。但是,如果您實際上在目標類別中有一個稱為「none」的網域名稱屬性,這將無法使用!