看一下文档,很清楚:
http://grails.github.io/grails-doc/2.5.0/guide/GORM.html#gormAssociation
无论如何,我不确定我是否理解你想要做什么,但让我们试试吧。
如果是一对一的关系,你可以简单地做这样的事情:
class DomainA {
DomainB domainB
DomainC firstDomainC
DomainC secondDomainC
}
class DomainB {
}
class DomainC {
}
这将在“domain_a”表中创建以下字段:
- “domain_b_id”
- “first_domain_c_id”
- “second_domain_c_id”
如果它是从 DomainA 到 DomainB 和 DomainC 的一对多关系,并且在 DomainA 中有两个不同的 DomainC 集合,则您必须在 DomainC 中具有两个不同的 DomainA 属性才能映射它。
文档中的机场和航班示例:
class Airport {
static hasMany = [outboundFlights: Flight, inboundFlights: Flight]
static mappedBy = [outboundFlights: "departureAirport",
inboundFlights: "destinationAirport"]
}
class Flight {
Airport departureAirport
Airport destinationAirport
}
航班需要到 Airport 属性,以便能够区分哪个正在映射正确的 Airport 中的 hasMany 集合。
编辑:以赛车手为例
Grails 支持多对多关系,但其中一个端点必须是主端点,而另一个端点必须另外有一个 belongsTo。虽然情况并非如此,因为比赛既不属于车手,也不属于车手。
我会使用与属性的关系:“驱动器”与属性“mainDriver”。
那不能直接映射,你需要为关系使用域:
class Race {
static hasMany = [ participants: DriverRace ]
def mainDrivers() {
getDrivers( false )
}
def substitutes() {
getDrivers( false )
}
private getDrivers( mainDriver ) {
DriverRace.withCriteria {
eq( "race", this )
eq( "mainDriver", mainDriver )
}.collect { it.driver }
}
}
class Driver {
static hasMany = [ races: DriverRace ]
}
class DriverRace {
static belongsTo = [ race: Race, driver: Driver ]
boolean mainDriver
}