grailsgorm:为对象集合使用映射

grailsgorm:为对象集合使用映射,grails,groovy,gorm,one-to-many,Grails,Groovy,Gorm,One To Many,我希望在Gorm中映射一对多关系,支持集合是字符串到对象的映射,而不是默认集合。grails文档给出了以下示例: 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() 这是非常接近我想要的,但不是安静。这

我希望在Gorm中映射一对多关系,支持集合是字符串到对象的映射,而不是默认集合。grails文档给出了以下示例:

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()
这是非常接近我想要的,但不是安静。这样做的目的是将任意字符串stephen存储在一个与其他图书数据分开的联接表中,以及此关系的一些其他映射信息。当Gorm从数据库重新加载该对象时,它只读取该存储值并将其用作映射中的键

我想要的是更像Hibernate中的@MapKey的东西,您可以在value对象上指定一个属性作为映射键。这样就没有额外的表了,映射的值在保存时被持久化到数据库中。键在保存时几乎被忽略,因为它们是冗余信息。当从数据库加载集合时,该属性从对象中读取并用作映射键

当映射键基于存储在对象中的数据时,这看起来更干净,因为您不必使用值对象使映射键列保持最新。在本例中,如果作者的名字从stephen更改为steve,则必须更新对象,并将其重新存储在不同的键下


这在Gorm中可能吗?

hmmm不确定,但您可以使用@MapKey注释创建一个src/java类。GORM方法仍然可用。在这里签出更多:我必须用Java编写域类,对吗?根据指南是的,但您可以先在src/groovy中尝试,我不记得它是否有效。