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"
}
网友评论