我尝试以2种不同的方式定义一对一关系:
Grails 2.0.3
情况1:
class Car {
String model
Engine eng
static constraints = {
eng unique: true
}
}
class Engine {
Double capacity
static belongsTo = [car : Car]
}
情况2:
class Car {
String model
static hasOne = [eng : Engine]
static constraints = {
eng unique: true
}
}
class Engine {
Double capacity
static belongsTo = [car : Car]
}
看起来很相似,并且都提供一对一的双向映射。不幸的是,在这两种情况下,DB具有不同的结构。
情况1:
情况2:
为什么一次Car和一次Engine保持与第二张表的链接。
我的问题在哪里?从DDD角度看代码时,两种情况都表明Car类更重要,而Car聚合引擎更重要。不幸的是,当我从案例2的数据库角度来看时,我宁愿说那是相反的-引擎聚合汽车。当然,我可以使用第一种方法,但是我看到的大多数关于grails的文章,都是定义关系的第二种方法。也许我误解了某些东西,然后以错误的方式使用hasOne?
最佳答案
documentation on hasOne
指出,使用此方法会创建双向一对一关系,其中外键位于子项上。
belongsTo
表示在父级上执行的操作(例如,保存和更新)将通过休眠级联到子级。
因此,如果您希望外键在Engine
上,请在static hasOne = [engine:Engine]
上使用Car
。
如果您希望外键在Car
上,则在Engine engine
上使用Car
。
在这两种情况下,请在belongsTo = [car: Car]
上使用Engine