Grails框架之Domain与GORM

2017-01-19 10:25

Grails框架之Domain与GORM

domain实体类在任何的应用场景中都处于核心位置,它是数据的封装抽象形式
假设现需构建一个在线歌曲商城应用,用户可以购买歌曲,评论歌曲,预览歌曲等,为简化描述问题先不考虑系统的实现方式,按需求分析该应用至少比包括Artist(艺术家)、Album(专辑)、Song(歌曲)3个实体,每个实体具有其特有的属性,约定每位Artist(艺术家)将拥有多张Album(专辑),而每张专辑收录多首Song(歌曲)。

  • Car和Engine之间是一对一的关系
Class Car{
    Engine engine
}
Class Engine{
   Car car
}
  • 但在实际情况中,我们会经常遇到实体间的从属关系,例如An Engine belongs to a Car,but a Car does not belong to an Engine Grails提供实现该关系的机制。
Class car{
    Engine engine
}

Class Engine{
    static  belongsTo=[car:Car]
}//An Engine belongs to a Car

Engine类中belongsTo属性值是一个Map,键值key是car(Car类的引用),belongsTo表明Car实体是关系的拥有者,此时数据库中Car表中引用Engine主键id作为其外键,但Engine表中并无外键应用

  • 若想Engine中引用Car表的主键id作为其外键,可以将二者的关系定义为:
Class Car{
    Engine engine
   static hasOne=[engine:Engine]
}
Class Engine{
    static belongsTo=[car:Car]
}
  • Artist与Album之间为1对多关系;Album与Song之间也为一对多关系),在定义关系的同时同时可以定义约束
//艺术家
class Artist {
    String name
    static constraints = {
       name(nullable: false,unique: true)//定义非空唯一约束
    }
    static mapping = {
        version(false) //消除version默认属性
        id:'identity' //主键自增
    }
    static hasMany = [albums:Album] //与Album建立一对多关系
}
//专辑
class Album {
    String title
    static constraints = {
    }
    static mapping = {
        version(false)
        id:'identity'
    }
    static hasMany = [songs:Song] //与Song建立一对多关系
    static  belongsTo = [artist:Artist]  //Album表外键引用Artist表的主键
}
//歌曲
class Song {
    String title
    Integer duration //歌曲时长

    static constraints = {
        title (blank: false,unique: true)
    }
    static mapping = {
        version(false)
        id:'identity'
        duration(min:1)
    }
    static  belongsTo = [album:Album] //Song表中外键应用Album表主键
}
  • 如果想排序显示
static mapping = {
sort "startDate"
}

查看原文