我尝试以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

09-11 18:39
查看更多