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 網域類別。請參閱 Hibernate 整合部分,了解如何用 Java 編寫網域類別,但仍使用動態持久方法。以下是 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 {
}
如果您在 DataSource 上將 dbCreate 屬性設定為「update」、「create」或「create-drop」,Grails 會自動為您產生/修改資料庫表格。
|
您可以透過新增屬性來自訂類別
class Person {
String name
Integer age
Date lastVisit
}
grails console
這會載入一個互動式 GUI,您可以在其中執行 Groovy 指令,並存取 Spring ApplicationContext、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 專案的 專用文件。