(快速参考)

6 对象关系映射 (GORM)

版本 6.2.0

6 对象关系映射 (GORM)

域类是任何业务应用程序的核心。它们保存有关业务流程的状态,并且希望也能实现行为。它们通过关系链接在一起:一对一、一对多或多对多。

GORM 是 Grails 的对象关系映射 (ORM) 实现。它底层使用 Hibernate(一种非常流行且灵活的开源 ORM 解决方案),并且由于 Groovy 具有静态和动态类型的动态特性,以及 Grails 的约定,因此创建 Grails 域类所需的配置要少得多。

您也可以用 Java 编写 Grails 域类。有关如何用 Java 编写域类但仍然使用动态持久化方法,请参阅 Hibernate 集成部分。下面是 GORM 的实际应用预览

def book = Book.findByTitle("Groovy in Action")

book
  .addToAuthors(name:"Dierk Koenig")
  .addToAuthors(name:"Guillaume LaForge")
  .save()

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
}

拥有域类后,请尝试使用 shellconsole 通过键入以下内容来操作它

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

这使用 get 方法,该方法需要一个数据库标识符来从数据库中读取 Person 对象。您还可以使用 read 方法以只读状态加载对象

def p = Person.read(1)

在这种情况下,底层 Hibernate 引擎不会进行任何脏检查,并且对象不会被持久化。请注意,如果您显式调用 save 方法,则该对象将被放回读写状态。

此外,您还可以使用 load 方法加载实例的代理

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()

6.2 GORM 进一步阅读

有关使用 GORM 的更多信息,请参阅 GORM 项目的专用文档