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文档