(Quick Reference)
mappedBy
Purpose
The
mappedBy
static property allows you to control whether an association is mapped as unidirectional or bidirectional, and which properties form the reverse direction in the case of bidirectional associations.
Examples
In this example the
Airport
class defines two bidirectional one-to-many associations. Without defining
mappedBy
this is impossible as GORM cannot differentiate which of the two properties on the other end of the association (either
departureAirport
or
destinationAirport
in the
Route
class) each one-to-many should be associated with.
The solution is to define
mappedBy
which tells the
Airport
class how each association relates to the other side.
class Airport { static mappedBy = [outgoingFlights: 'departureAirport',
incomingFlights: 'destinationAirport'] static hasMany = [outgoingFlights: Route,
incomingFlights: Route]
}
class Route {
Airport departureAirport
Airport destinationAirport
}
Separate example for many-to-one relationships:
class Person {
String name
Person parent static belongsTo = [ supervisor: Person ] static mappedBy = [ supervisor: "none", parent: "none" ] static constraints = { supervisor nullable: true }
}
Description
Grails needs to know whether associations are unidirectional or bidirectional, and in the case of the latter, which properties are involved from both sides. Normally it can infer this information, but when there are multiple properties with the same type its guess can sometimes be wrong. The
mappedBy
property is a simple map of property name pairs, where the key is the name of an association property in the current domain class and the value is the name of an association property in the domain class on the other side of the association (which may be itself). The examples above should clarify this.
You can also specify a value of "none" in the map, which indicates that the association is unidirectional. However, this won't work if you actually have a domain property called "none" in the target class!