域类是任何业务应用的核心。他们保持有关的业务流程状态和实现行为。他们是通过关系连在一起的,一对一,一对多,多对多。
GORM是Grails对象关系映射(ORM)的实现。在底层,它使用Hibernate3(一个非常受欢迎的和灵活的开源ORM解决方案),感谢GORM的静态和动态类型的Groovy特性,加上Grails的约定,创建Grails领域类的配置也远远低于其他框架。
您也可以在Java中编写Grails域类。请参阅Hibernate的集成,在Java中写域类,仍然要使用动态持久方法。下面是GORM在action中的一个预览:
def book =Book.findByTitle("Groovyin Action")
book
.addToAuthors(name:"Dierk Koenig")
.addToAuthors(name:"Guillaume LaForge")
.save()
快速入门指南
通过create-domain-class命令可以创建域类:
grailscreate-domain-class helloworld.Person
!!!如果未指定程序包创建域类脚本,Grails自动使用该应用程序的名称作为包名。
这将在grails-app/domain/helloworld/Person.groovy位置创建一个类:
package helloworld
class Person {
}
如果你在数据源配置中将dbCreate属性设置为“update”,“create”或“create-drop”,Grails将自动生成或修改你的数据库表。
您可以在生成的类中添加自定义的属性:
class Person {
String name
Integer age
Date lastVisit
}
一旦你有一个域类,可以尝试用shell或console上输入:
grails console
加载一个交互式的图形用户界面,在这里你可以运行Groovy命令访问到Spring的ApplicationContext,GORM等。
基本的CRUD
尝试执行一些基本的CRUD(创建/读取/更新/删除)操作。
创建
要创建一个域类对象,使用Map的构造函数设置其属性值并保存:
def p = new Person(name:"Fred", age: 40, lastVisit:new Date())
p.save()
save方法将坚持你的类使用底层的HibernateORM层到数据库。
阅读
Grails增加了一个隐含的id属性,您可以使用您的域类检索:
def p =Person.get(1)
assert 1 == p.id
使用GET方法,从数据库中读取Person对象返回一个数据库标识符。您也可以使用的read方法载入只读状态中的对象:
def p =Person.read(1)
在这种情况下,底层的Hibernate引擎对不会做任何脏检查的对象不会保留。请注意,如果你明确地调用保存方法,需要将对象放置到读写状态。
此外,您还可以通过使用负载方法加载一个代理实例:
def p =Person.load(1)
这不会招致该数据库访问的方法之前其他的getId()被调用。它会初始化Hibernate的代理实例,如果没有找到记录指定的ID,抛出一个异常,。
更新
要更新的一个实例,改变一些属性,然后再次调用save:
def p =Person.get(1)
p.name = "Bob"
p.save()
删除
使用delete方法删除实例:
def p =Person.get(1)
p.delete()
GORM中域建模
创建Grails应用程序时,你必须要考虑你正在试图解决的问题域。例如,如果你正在建立一个亚马逊风格的书店,你会思考书籍,作者,客户和出版商,仅举几例。
这些仿照GORM中的Groovy类,书类可能有一个标题,发布日期,ISBN号等。接下来的几节显示在GORM中如何模拟域。
要创建一个域类,运行时create-domain-class命令如下:
grailscreate-domain-class org.bookstore.Book
其结果将是创建一个类的基础grails-app/domain/org/bookstore/Book.groovy:
package org.bookstore
class Book {
}
这个类会自动映射到数据库中的一个表被称为book(类相同的名称)。此行为是通过ORM的领域特定语言定制
现在,你有一个域类,你可以定义其属性的Java类型。例如:
package org.bookstore
class Book {
String title
Date releaseDate
String ISBN
}
每个属性映射到数据库中的一列,其中列名的惯例是全部小写,用下划线分隔。例如的RELEASEDATE映射到一列RELEASE_DATE。 SQL类型自动检测从Java类型,但可以定制约束或ORM DSL。