扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在写域类时,无须添加与业务无关的属性,比如在用Hibernate时,我们需要(不强制)在类中定义id,但用GORM时,id无须自己声明,GORM 会帮我们自动添加id和version。GORM通过反射机制获得域类属性信息决定数据库字段类型,所以在定义域类时不要使用def关键字来定义属性,务必明确定义属性类型,比如在下面的域类Article中,用String来定义content(而不是def content),在默认情况下,String映射到数据库中的字段类型是VARCHAR(Date映射到数据库中的字段类型是DATETIME),如果通过类变量contraints定义了String的长度范围,且长度过长,映射到数据库中的字段类型会变为TEXT,十分智能。
eg. class Article { Date dateAdded // Date 映射到数据库中的字段类型是DATETIME String content static constraints = { content(blank: false, size: 0..65535) // 如果没有定义content的大小范围,它在数据库中类型为VARCHAR最大长度是255, // 显然不满足我们的需求,这样定义后,数据库中的字段类型会变为TEXT } } |
如果将数据源
下面让我们看一下GORM中的1:1,1:N,N:1,N:N以及继承关系映射:
1,一对一关系:
class Dog { String name Tail tail // 狗有一条尾巴 } class Tail { float size Dog owner // 尾巴也知道自己属于那只狗 } |
class Tail { float size Dog owner // 尾巴也知道自己属于那只狗 static belongsTo = Dog // 注意是static的 } |
级联更新/保存:当Dog对象更新/保存,Dog对象所引用的Trail对象也更新/保存;反之亦然。
2,一对多,多对一关系:
class Dog { String name static hasMany = [feet: Foot] // 通过声明类变量hasMany,来定义Dog‘一’这方有多Foot } class Foot { float size Dog owner static belongsTo = Dog // 在一对多,多对一关系中,默认‘多’方belongsTo‘一’方 } |
关于保存,更新和删除与一对一关系相同,都是级联更新/保存和级联删除,当Dog被删除时,由于Foot belongsTo(属于) Dog,所以Dog对象所引用的所有Foot对象全被删除;而当Foot对象被删除时,Dog对象不会被删除。这是通过类变量belongsTo实现的。
3,多对多关系:
class Teacher { String name static hasMany = [students: Student] } class Student { String name static hasMany = [teachers: Teacher] static belongsTo = Teacher // 在多对多关系中,至少有一方声明类变量belongsTo } |
更新/保存在多对多关系中,相对一对一,一对多,多对一关系中要特殊点,就是只有‘拥有方’可以级联更新/保存,比如在本例中,由于Student belongsTo Teacher ,所以Teacher是‘拥有方’,Teacher的更新/保存将引起Teacher对象所引用的所有Student对象的更新/保存。
删除也有点特殊,‘拥有方’被删除后,它所引用的对象不会被删除,你必须自己删除它们,否则它们将成为‘孤儿’
4,继承关系:
class Base {...}
class Derived extends Base {...}
只要定义类,无需任何配置,够简单吧。
用Grails开发就是这么简单快捷,域类定义好了之后,剩下的事情,比如建表,约束等,Grails全帮您自动搞定,很省心!Grails官方网站上有很多文档供参考,对GORM的进一步学习,您可以看一下GORM
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者