NEO

蜀道难,难于上青天!

导航

Grails指南摘要-304-对象关系

Posted on 2013-06-04 21:58  页面载入出错  阅读(223)  评论(0编辑  收藏  举报

one-to-one

class Car {
    Engine engine
}
class Engine {
    Car car
}

这两个关系没有所有者,可以说一辆汽车有一个引擎.也可以说一个引擎有一辆汽车,显然不太够,需要增加一个所有者的标示

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

加入这个关系后告诉我们,一个引擎属于一辆汽车,还可以更明确的表示一台车只有一个引擎

class Car {
    static hasOne = [engine: Engine]
}

至于是哪个是哪个引擎,则在这里关联,这样,任何时候删除car的实例,和这个car实例有关联的engine都会被删除

class Engine {
    static belongsTo = Car 
}

 

 one-to-many

one-to-many关联关系和one-to-one很类似,只需要把hasOne修改成hasMany就完成了,如下

class Artist {
    String name
    static hasMany = [albums:Album]
}
class Album {
    String title
    static hasMany = [songs:Song]
    static belongsTo = [artist:Artist]
}
class Song {
    String title
    Integer duration
    static belongsTo = Album
}

static hasMany = [albums:Album]:一个artist(艺术家)有多张album(唱片)

static belongsTo = [artist:Artist]:当artist实例删除后,album也一并删除

static hasMany = [songs:Song]:一张album(唱片)收录了多首song(歌曲)

static belongsTo = Album:当album实例删除后,收录的song也一并删除

 

在这里如果根据album查找song时,找到的song list是无序的,可以增加一个排序达到直接搜索到有序的song list

 

class Album {
    String title
    static hasMany = [songs:Song]
    static belongsTo = [artist:Artist]
    SortedSet songs
}

 

一个对象可能会有多个one-to-many的关系存在,如

class Artist {
    String name
    static hasMany = [albums:Album, instruments:Instrument]
}

一个艺术家有多张唱片,也有多个乐器

 

自定义级联行为

class Album {
    String title
    static hasMany = [songs:Song]
    static belongsTo = [artist:Artist]
    static mapping = {
        songs cascade: 'delete'
    }
}

album和song级联删除,具体的细节可以参考hibernate文档