读书人

依据表结构来创建Grails的Domain

发布时间: 2012-08-22 09:50:35 作者: rapoo

根据表结构来创建Grails的Domain
首先是一对一的关系,假设有两张表,Face和Nose
Face表
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
| nose_id | bigint(20) | NO | MUL | NULL | |
+---------+--------------+------+-----+---------+----------------+
Nose表
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
+---------+--------------+------+-----+---------+----------------+

最简单的定义方式就是

class Face {    String name    Nose nose}class Nose {    String name}

为了从Nose反向找face方便,也可以加一个双向的引用,把Nose的定义修改一下
class Nose {    String name    static belongsTo = [face:Face]}


如果想让face表里面不出现nose_id,而是在nose表中增加一个face_id作为外键,可以这样定义
class Face {    String name    }class Nose {    String name    static belongsTo = [face:Face]}

同样,为了双向引用,可以把Face类的定义修改为
class Face {    String name    static hasOne = [nose : Nose]}


接下来是一对N的关系,假设有两张表,Book和Author,简化为每本书只有一个作者,每个作者可以有很多本书
Author表
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+

Book表
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| author_id | bigint(20) | NO | MUL | NULL | |
| name | varchar(255) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+

对应的Domain类定义为
class Author {    String name    static hasMany = [book: Book]    }class Book {    String name;        static belongsTo = [author : Author]}


最后是N对N的关系,还是用Author和Book表,每本书可以有多个作者,每个作者也有多本著作
这时候需要一张中间表来保存映射关系
author_book
+-----------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| book_id | bigint(20) | NO | PRI | NULL | |
| author_id | bigint(20) | NO | PRI | NULL | |
+-----------+------------+------+-----+---------+-------+
同时Book表中也不再有author_id的外键

Author类不变,把Book的定义改成下面这样就可以了
class Book {    String name;    static hasMany = [author:Author]    static belongsTo = Author}

读书人网 >网络基础

热点推荐