- 摘要:GORM就是以前我剛學Groovy沒多久時想實現的功能,它使開發人員不需要關心數據庫方面,也不需要任何配置,只需專心用OO思想設計自己的系統,還有一個好處就是開發時不用備份數據庫,因為GORM會自動幫你建表以及約束(但數據庫需要你自己建),讓我們來看一下用Grails開發是多么簡單高效吧!
在寫域類時,無須添加與業務無關的屬性,比如在用Hibernate時,我們需要(不強制)在類中定義id,但用GORM時,id無須自己聲明,GORM 會幫我們自動添加id和version。GORM通過反射機制獲得域類屬性信息決定數據庫字段類型,所以在定義域類時不要使用def關鍵字來定義屬性,務必明確定義屬性類型,比如在下面的域類Article中,用String來定義content(而不是def content),在默認情況下,String映射到數據庫中的字段類型是VARCHAR(Date映射到數據庫中的字段類型是DATETIME),如果通過類變量contraints定義了String的長度范圍,且長度過長,映射到數據庫中的字段類型會變為TEXT,十分智能。
eg. class Article { Date dateAdded // Date 映射到數據庫中的字段類型是DATETIME String content static constraints = { content(blank: false, size: 0..65535) // 如果沒有定義content的大小范圍,它在數據庫中類型為VARCHAR最大長度是255, // 顯然不滿足我們的需求,這樣定義后,數據庫中的字段類型會變為TEXT } } |
如果將數據源
下面讓我們看一下GORM中的1:1,1:N,N:1,N:N以及繼承關系映射:
1,一對一關系:
class Dog { String name Tail tail // 狗有一條尾巴 } class Tail { float size Dog owner // 尾巴也知道自己屬于那只狗 } |
class Tail { float size Dog owner // 尾巴也知道自己屬于那只狗 static belongsTo = Dog // 注意是static的 } |
級聯更新/保存:當Dog對象更新/保存,Dog對象所引用的Trail對象也更新/保存;反之亦然。
2,一對多,多對一關系:
class Dog { String name static hasMany = [feet: Foot] // 通過聲明類變量hasMany,來定義Dog‘一’這方有多Foot } class Foot { float size Dog owner static belongsTo = Dog // 在一對多,多對一關系中,默認‘多’方belongsTo‘一’方 } |
關于保存,更新和刪除與一對一關系相同,都是級聯更新/保存和級聯刪除,當Dog被刪除時,由于Foot belongsTo(屬于) Dog,所以Dog對象所引用的所有Foot對象全被刪除;而當Foot對象被刪除時,Dog對象不會被刪除。這是通過類變量belongsTo實現的。
3,多對多關系:
class Teacher { String name static hasMany = [students: Student] } class Student { String name static hasMany = [teachers: Teacher] static belongsTo = Teacher // 在多對多關系中,至少有一方聲明類變量belongsTo } |
更新/保存在多對多關系中,相對一對一,一對多,多對一關系中要特殊點,就是只有‘擁有方’可以級聯更新/保存,比如在本例中,由于Student belongsTo Teacher ,所以Teacher是‘擁有方’,Teacher的更新/保存將引起Teacher對象所引用的所有Student對象的更新/保存。
刪除也有點特殊,‘擁有方’被刪除后,它所引用的對象不會被刪除,你必須自己刪除它們,否則它們將成為‘孤兒’
4,繼承關系:
class Base {...}
class Derived extends Base {...}
只要定義類,無需任何配置,夠簡單吧。
用Grails開發就是這么簡單快捷,域類定義好了之后,剩下的事情,比如建表,約束等,Grails全幫您自動搞定,很省心!Grails官方網站上有很多文檔供參考,對GORM的進一步學習,您可以看一下GORM