(快速參考)

6 物件關係對映 (GORM)

版本 6.2.0

6 物件關係對映 (GORM)

網域類別是任何商業應用程式的核心。它們保存關於商業流程的狀態,並期望也實作行為。它們透過關聯連結在一起;一對一、一對多或多對多。

GORM 是 Grails 的物件關係對映 (ORM) 實作。它在底層使用 Hibernate(一個非常流行且彈性的開源 ORM 解決方案),由於 Groovy 的動態特性,具備靜態和動態型別,以及 Grails 的慣例,因此在建立 Grails 網域類別時,所涉及的組態少得多。

您也可以用 Java 編寫 Grails 網域類別。請參閱 Hibernate 整合部分,了解如何用 Java 編寫網域類別,但仍使用動態持久方法。以下是 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 {
}
如果您在 DataSource 上將 dbCreate 屬性設定為「update」、「create」或「create-drop」,Grails 會自動為您產生/修改資料庫表格。

您可以透過新增屬性來自訂類別

class Person {
    String name
    Integer age
    Date lastVisit
}

在您擁有網域類別後,嘗試使用 shellconsole 輸入以下內容來操作它

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

這會使用 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 專案的 專用文件