在grails中,我们既可以使用GORM来实现O/R mapping,也可以使用已经定义好的基于hibernate的java实现,mapping文件方式或annontation方式都可以。
首先介绍一下GORM。
Groovy代码
- class Book {
- static withTable = "book_table"
- static transients = [ "digitalCopy" ]
- static constraints = {
- releaseDate(nullable: true)
- }
- String author = 'Author unknown'
- String title
- Date releaseDate
- File digitalCopy
- }
- 指定表名:定义一个名为withTable的属性,默认的表名为Domain类名
- 不需要持久化的属性: 在domain中添加一个名为transients的list,并列出不需持久化的属性名
- 非空限制: 添加一个constraints的list
- 默认值: 在字段后直接赋值
- 属性命名时要注意回避SQL的保留字
One-to-One关系
在GORM中可以方便地指定一个属性是另一个类的对象,但是要实现级联删除这样的功能,需要如下指定:
- class Face {
- static belongsTo = Nose
- Nose nose
- }
这样指定后,一个Nose被删除,所有使用它的Face都会被删除。
One-to-Many & Many-to-One 当指向类(Book)中有多个同类(Author)字段时,可以使用mappedBy指定
- class Author {
- static hasMany = [ books : Book ]
- String name
- }
- class Author {
- static hasMany = [books:Book, coBooks:Book]
- static mappedBy = [books:"mainAuthor", coBooks:"coAuthor"]
- String name
- }
添加时,使用author.addToBooks(book)或者author.addToCoBooks(book)将book加入到指定的集合中。
Many-to-Many
在两端都指定hasMang即可,不过要注意的是,必须要在某一端指定belongsTo
Composition
在GORM中可以实现组合映射,即一个复杂属性映射到表中的几个字段。使用Embedded列表列出需要实现compostion的属性即可。
Inheritance
直接在类名上用extends就完了,都不用标记Discriminator的。