def book = Book.findByTitle("Groovy in Action")
book
.addToAuthors(name:"Dierk Koenig")
.addToAuthors(name:"Guillaume LaForge")
.save()
6 对象关系映射 (GORM)
版本 6.2.0
6 对象关系映射 (GORM)
域类是任何业务应用程序的核心。它们保存有关业务流程的状态,并且希望也能实现行为。它们通过关系链接在一起:一对一、一对多或多对多。
GORM 是 Grails 的对象关系映射 (ORM) 实现。它底层使用 Hibernate(一种非常流行且灵活的开源 ORM 解决方案),并且由于 Groovy 具有静态和动态类型的动态特性,以及 Grails 的约定,因此创建 Grails 域类所需的配置要少得多。
您也可以用 Java 编写 Grails 域类。有关如何用 Java 编写域类但仍然使用动态持久化方法,请参阅 Hibernate 集成部分。下面是 GORM 的实际应用预览
6.1 快速入门指南
可以使用 create-domain-class 命令创建域类
grails create-domain-class myapp.Person
如果使用 create-domain-class 脚本没有指定包,Grails 会自动使用应用程序名称作为包名称。 |
这将在 grails-app/domain/myapp/Person.groovy
位置创建一个类,如下所示
package myapp
class Person {
}
如果您的 数据源 上的 dbCreate 属性设置为“update”、“create”或“create-drop”,Grails 将自动为您生成/修改数据库表。 |
您可以通过添加属性来自定义类
class Person {
String name
Integer age
Date lastVisit
}
grails console
这将加载一个交互式 GUI,您可以在其中运行 Groovy 命令并访问 Spring 应用程序上下文、GORM 等。
6.1.1 基本 CRUD
尝试执行一些基本的 CRUD(创建/读取/更新/删除)操作。
创建
要创建域类,请使用 Map 构造函数设置其属性并调用 save
def p = new Person(name: "Fred", age: 40, lastVisit: new Date())
p.save()
save 方法将使用底层 Hibernate ORM 层将您的类持久化到数据库。
读取
Grails 透明地将隐式 id
属性添加到您的域类中,您可以使用它进行检索
def p = Person.get(1)
assert 1 == p.id
def p = Person.read(1)
在这种情况下,底层 Hibernate 引擎不会进行任何脏检查,并且对象不会被持久化。请注意,如果您显式调用 save 方法,则该对象将被放回读写状态。
此外,您还可以使用 load 方法加载实例的代理
def p = Person.load(1)
在调用 getId() 以外的方法之前,这不会产生数据库访问。然后,Hibernate 初始化代理实例,或者如果未找到指定 ID 的记录,则抛出异常。
6.2 GORM 进一步阅读
有关使用 GORM 的更多信息,请参阅 GORM 项目的专用文档。