【问题标题】:Grails one to one relationGrails 一对一关系
【发布时间】:2012-07-19 06:04:35
【问题描述】:

我尝试以 2 种不同的方式定义一对一关系:
Grails 2.0.3

案例一:

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 聚合了 Engine。不幸的是,当我从数据库方面看案例 2 时,我宁愿说它是相反的 - 引擎聚合汽车。当然,我可以使用第一种方法,但我看到的大多数关于 grails 的出版物都是定义关系的第二种方法。也许我误解了一些东西,我以错误的方式使用 hasOne?

【问题讨论】:

    标签: database grails grails-orm


    【解决方案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

    关于多对一/一对一映射


    希望对你有帮助:)

    【讨论】:

    • 我不确定,但是,这是正确的映射方式吗……因为引擎引擎类似于多对一,然后将约束设置为唯一……这有什么意义吗?你可以选择 hasOne 他们的...
    【解决方案2】:

    documentation on hasOne 声明使用它会创建一个双向的一对一关系,其中外键位于子级上。

    belongsTo 表示对父级执行的操作(例如保存和更新)将通过休眠级联到子级。

    因此,如果您希望外键位于 Engine 上,请在 Car 上使用 static hasOne = [engine:Engine]。

    如果您希望外键位于 Car 上,则在 Car 上使用 Engine engine。

    在这两种情况下,在 Engine 上使用 belongsTo = [car: Car]

    【讨论】:

    • 很好的解释! belongsTo 不会创建与外键的关系,但其他情况会。只是你需要研究你认为外键应该在哪里。
    • belongsTo 在这两种情况下都不需要。在hasOne 或hasMany 中需要它。但是如果要创建“使用关系”,则不需要belongsTo,因为您不想删除其他对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多