orm样式的Domain最终会在数据库表中体现出来,Domain类的从属关系会以数据库关联映射来体现。
一对多/多对一
---
__示例__:
Class Country:
[pk] +id
+name
Class Province:
[pk] +id
+name
[fk]-> +country
`Country`国家 可以拥有多个省份,就国家与省份来说,是__一对多__的关系
`Province`省份 只能属于一个国家,`country`标明它所属的国家,为外键,就省份与国家来说,是__多对一__的关系
__Grails Domain__:
class Country {
String name
//一对多,hasMany,是一个字典集合
static hasMany = [province:Province]
}
class Province {
String name
//多对一,字典集合
static belongsTo = [country:Country]
}
带码中两个domian互相说明了自己在一对多/多对一中的关系,这样在进行各种CRUD操作时,grails会帮我们进行级联操作
多对多
---
__示例__:
Class City:
[pk] +id
+name
Class Road:
[pk] +id
+name
Class City-Road:
[pk] +id
[fk]-> +city
[fk]-> +road
`City` 城市可以有多个公路
`Road` 一条公路可以横穿多个城市
多对多关系中,一般会额外用一个表来记录映射关系
__Grails Domain__:
class City {
String name
//多对多
static hasMany = [province:Province]
}
class Road {
String name
//多对多
static hasMany = [city:City]
//belongsTo最重要的作用是绑定级联操作
//在这里,单独对road进行操作,不会影响到city
//如果对road的属主city进行操作,势必会级联影响到road
static belongsTo = [Country] //这里不是字典了,而是个列表,因为这样不会创建某个字段,只是将逐渐绑定
}
在多对多关系中,如果考虑了级联操作,最重要的是要定义好主从关系,即以哪个表为主
这样的代码,生成脚手架后,crud会自动级联的。