概述
对象集
默认情况下,当你定义中GORM一个java.util.Set映射,这是一个无序的集合,不能包含重复。换句话说,当你有:
class Author {
static hasMany = [books: Book]
}
books属性是GORM注入一个java.util.Set映射。Sets保证唯一性,但没有秩序,这可能不是你想要的。要自定义排序,你要配置Set,就像下面的SortedSet:
class Author {
SortedSet books
static hasMany = [books: Book]
}
这里是一个java.util.SortedSet的实现,它意味着你必须在你的Book class中实现java.lang.Comparable:
class Book implements Comparable {
String title
Date releaseDate = new Date()
int compareTo(obj) {
releaseDate.compareTo(obj.releaseDate)
}
}
上述类的结果是在Author类的books集合中按照发布日期排序的一个Book实例。
对象列表
为了保持它们被添加的顺序和对象能够像一个数组按照索引引用它们,你可以定义你的集合类型为List:
class Author {
List books
static hasMany = [books: Book]
}
在这种情况下,当你添加新的元素到books集合中,排序是一个从0开始索引的顺序列表,你可以这样做:
author.books[0]// get the first book
其工作原理是Hibernate在数据库层创建一个叫做books_idx的列用来将集合中的元素的索引顺序保存在数据库层。
当使用List时,在保存之前必须将添加元素到集合中,否则Hibernate会抛出一个的异常(org.hibernate.HibernateException:空索引列的集合):
// This won'twork!
def book = new Book(title: 'The Shining')
book.save()
author.addToBooks(book)
// Do it this way instead.
def book = new Book(title: 'Misery')
author.addToBooks(book)
author.save()
对象包
如果排序和唯一性不用考虑(或者你能明确管理这些)那么你可以使用 Hibernate Bag 类型来表示映射的集合。
唯一需要改变的是定义集合类型Collection:
class Author {
Collection books
static hasMany = [books: Book]
}
由于唯一性和排序由Hibernate管理,从集合中添加或删除映射为一个包的,不触发数据库中的所有实例的负载,所以这种方式比使用Set或者List将有更好的表现和需要较少的内存。
对象Maps
如果你想要一个简单的map字符串/值对,GORM可以用下面的映射:
class Author {
Map books // map of ISBN:book names
}
def a = new Author()
a.books = ["1590597583":"Grails Book"]
a.save()
在这里map的键和值都必须是String类型的。
如果你想 Map 对象,你可以这样做:
class Book {
Map authors
static hasMany = [authors: Author]
}
def a = new Author(name:"Stephen King")
def book = new Book()
book.authors =[stephen:a]
book.save()
静态的hasMany属性在Map中定义了元素类型,键值必须是字符串。
集合类型及其性能
Java Set不允许重复。为确保唯一性,当添加一个实体到一个Set关联Hibernate不得不从数据库加载该实体的关联。假如你有大量的关联,那么在性能方面付出的代价是昂贵的。
List类型也有相同的特性,因为Hibernate需要加载整个关联,以维持顺序。因此建议,如果你希望关联大量的记录,那么你制作一个双向关联,以使链接可以创建在反面。例如,考虑下面的代码:
def book = new Book(title:"New Grails Book")
def author =Author.get(1)
book.author =author
book.save()
在这个例子中,关联链接从孩子(Book)创建,因此它没有必要去操作集合,使用更少的查询,代码更高效。由于Author有大量的关联的Book实例,如果你要编写类似下面的代码,对性能的影响就会加大:
def book = new Book(title:"New Grails Book")
def author =Author.get(1)
author.addToBooks(book)
author.save()
你也可以建立类似Hibernate包的集合模型。
最后
以上就是欣慰向日葵为你收集整理的Grails2中的Sets, Lists 和Maps的全部内容,希望文章能够帮你解决Grails2中的Sets, Lists 和Maps所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复