首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

依据表结构来创建Grails的Domain

2012-08-22 
根据表结构来创建Grails的Domain首先是一对一的关系,假设有两张表,Face和NoseFace表+---------+----------

根据表结构来创建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}

热点排行