2012-07-20 63 views
8

我试图在2个不同的方式来定义以一对一的关系:
的Grails 2.0.3Grails的以一对一的关系

情况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: enter image description here

案例2: enter image description here

为什么一次车,一旦发动机保持链接到第二个表。

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

回答

13

documentation on hasOne状态,使用这创建了一个双向的一对一关系,其中外键在孩子身上。

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

所以如果你想在Engine上使用static hasOne = [engine:Engine]Car上的外键。

如果您希望外键位于Car,那么请使用Engine engineCar

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

-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

多到1个/ 1对1映射


希望它能帮助:)

+0

我不知道,但,这是是映射正确的方式....因为发动机引擎类似于许多到一个,然后设置约束独特...它有任何意义吗?你可以和hasOne一起去... – 2014-04-28 06:39:58