我试图以两种不同的方式定义一对一的关系:
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和一次引擎保持链接到第二个表。
我的问题在哪里?当我查看代码时,从DDD的角度来看,两种情况都表明Car类更重要,Car聚合引擎。不幸的是,当我从DB侧看案例2时,我宁愿说它是相反的 - 引擎聚合汽车。当然我可以使用第一种方法,但我看到的大多数关于grails的出版物,提出了定义关系的第二种方式。也许我误解了一些东西而且我错误地使用了hasOne?
答案 0 :(得分:16)
documentation on hasOne
表示使用此方法会创建一个双向一对一关系,其中外键位于子项上。
belongsTo
表示对父级执行的操作(例如保存和更新)将由hibernate级联到子级。
因此,如果您希望外键在Engine
上static hasOne = [engine:Engine]
使用Car
。
如果您希望外键位于Car
,请在Engine engine
上使用Car
。
在这两种情况下,请在belongsTo = [car: Car]
Engine
答案 1 :(得分:-1)
我认为你应该尝试做这个方法。
class Car {
String model
Engine engine
static constraints = {
eng unique: true
}
}
class Engine {
Double capacity
Car car
}
我认为会成功。你可以在这里阅读:
默认情况下,地址关联将映射到外键列 叫做address_id。
http://grails.org/doc/latest/guide/GORM.html
多对一/一对一映射
希望有所帮助:)