电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

Groovy轻松入门——Grails实战之GORM


发布日期:2021/3/13
 
GORM就是以前我刚学Groovy没多久时想实现的功能它使开发人员不需要关心数据库方面也不需要任何配置只需专心用OO思想设计自己的系统还有一个好处就是开发时不用备份数据库因为GORM会自动帮你建表以及约束(但数据库需要你自己建)让我们来看一下用Grails开发是多么简单高效吧!

在Grails+中配置稍有不同详见 朝花夕拾——Groovy & Grails

在写域类时无须添加与业务无关的属性比如在用Hibernate时我们需要(不强制)在类中定义id但用GORM时id无须自己声明GORM会帮我们自动添加id和versionGORM通过反射机制获得域类属性信息决定数据库字段类型所以在定义域类时不要使用def关键字来定义属性务必明确定义属性类型比如在下面的域类Article中用String来定义content(而不是def content)在默认情况下String映射到数据库中的字段类型是VARCHAR(Date映射到数据库中的字段类型是DATETIME)如果通过类变量contraints定义了String的长度范围且长度过长映射到数据库中的字段类型会变为TEXT十分智能

class Article {Date dateAdded // Date 映射到数据库中的字段类型是DATETIMEString contentstatic constraints = {content(blank: false size: )

// 如果没有定义content的大小范围它在数据库中类型为VARCHAR最大长度是// 显然不满足我们的需求这样定义后数据库中的字段类型会变为TEXT}}

如果将数据源 /grailsapp/conf/XXXDataSource中的String dbCreate = updateGrails会自动帮我们同步内存和数据库中域类对象的状态这点是很方便的不需要在每次修改对象后update了(GORM中的save()相当于Hibernate中的saveOrUpdate())其好处犹如Java中new出一个对象当不再使用此对象时不需要自行delete一样在实际开发中您就会体会到了

下面让我们看一下GORM中的::NN:N:N以及继承关系映射

一对一关系

class Dog {String nameTail tail // 狗有一条尾巴}class Tail {float sizeDog owner // 尾巴也知道自己属于那只狗}

现在Dog和Tail的一对一关系是双向的当然你也可以去掉Tail类中的owner属性或Dog类中的tail属性使一对一关系变为单向的

级联删除当Dog对象被删除时则Dog对象所引用的Tail对象也将被相应删除;同样地当Tail对象被删除时Tail对象所引用的Dog对象也将被相应删除如果你认为Tail被切除后Dog应该还活着即Tail对象删除后Tail对象所应用的Dog对象不应该被删除那么我们可以通过在Tail类中声明类变量belongsTo来实现在这个场景中我们将Tail改为

class Tail {float sizeDog owner // 尾巴也知道自己属于那只狗static belongsTo = Dog // 注意是static的}

级联更新/保存当Dog对象更新/保存Dog对象所引用的Trail对象也更新/保存;反之亦然

一对多多对一关系

class Dog {String namestatic hasMany = [feet: Foot] // 通过声明类变量hasMany来定义Dog这方有多Foot}class Foot {float sizeDog ownerstatic belongsTo = Dog // 在一对多多对一关系中默认方belongsTo方}

关于保存更新和删除与一对一关系相同都是级联更新/保存和级联删除当Dog被删除时由于Foot belongsTo(属于) Dog所以Dog对象所引用的所有Foot对象全被删除;而当Foot对象被删除时Dog对象不会被删除这是通过类变量belongsTo实现的

多对多关系

class Teacher {String namestatic hasMany = [students: Student]}class Student {String namestatic hasMany = [teachers: Teacher]static belongsTo = Teacher // 在多对多关系中至少有一方声明类变量belongsTo}

更新/保存在多对多关系中相对一对一一对多多对一关系中要特殊点就是只有拥有方可以级联更新/保存比如在本例中由于Student belongsTo Teacher 所以Teacher是拥有方Teacher的更新/保存将引起Teacher对象所引用的所有Student对象的更新/保存

删除也有点特殊拥有方被删除后它所引用的对象不会被删除你必须自己删除它们否则它们将成为孤儿

继承关系

class Base {}class Derived extends Base {}

只要定义类无需任何配置够简单吧

用Grails开发就是这么简单快捷域类定义好了之后剩下的事情比如建表约束等Grails全帮您自动搞定很省心!Grails官方网站上有很多文档供参考对GORM的进一步学习您可以看一下GORM

上一篇:如何重构出DAO模式

下一篇:GlassFish中国探索发展模式