Grails一对一的关系

时间:2012-07-20 00:30:34

标签: database grails gorm

我试图以两种不同的方式定义一对一的关系:
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: enter image description here

案例2: enter image description here

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

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

2 个答案:

答案 0 :(得分:16)

documentation on hasOne表示使用此方法会创建一个双向一对一关系,其中外键位于子项上。

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

因此,如果您希望外键在Enginestatic 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

多对一/一对一映射


希望有所帮助:)