9

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

情况1:

class Car {
    String model  
    Engine eng  
    static constraints = {
        eng unique: true
    }
}

class Engine {
    Double capacity
    static belongsTo = [car : Car]
}

案例二:

class Car {
    String model
    static hasOne = [eng : Engine]
    static constraints = {
        eng unique: true
    }
}


class Engine {
    Double capacity
    static belongsTo = [car : Car]
}

看起来很相似,并且都提供一对一的双向映射。不幸的是,DB 在这两种情况下都有不同的结构。

情况1: 在此处输入图像描述

案例二: 在此处输入图像描述

为什么一次 Car 和一次 Engine 保持链接到第二个表。

我的问题在哪里?当我查看代码时,从 DDD 的角度来看,这两种情况都表明 Car 类更重要,而 Car 聚合了 Engine。不幸的是,当我从数据库方面看案例 2 时,我宁愿说它是相反的 - 引擎聚合汽车。当然我可以使用第一种方法,但是我看到的大多数关于 grails 的出版物都是定义关系的第二种方法。也许我误解了一些东西,我以错误的方式使用 hasOne?

4

2 回答 2

19

文档hasOne说明使用它会创建一个双向的一对一关系,其中外键在孩子身上。

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

因此,如果您希望外键Enginestatic hasOne = [engine:Engine].Car

如果您希望外键打开,请Car使用Engine engineon Car

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

于 2012-07-27T04:36:27.637 回答
-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

关于多对一/一对一映射


希望能帮助到你 :)

于 2012-07-20T06:17:42.900 回答