Grails / GORM以错误的顺序保存

时间:2011-02-09 15:59:03

标签: grails gorm

我正在使用Grails 1.3.6,我遇到了正确保存级联的问题。问题特别在于具有两个父类的类。我正在尝试的简化版本是:

class Location {
    String city
    static hasMany = [authors: Author, publishers: Publisher]
}

class Author {
    String name
    static belongsTo = [location: Location]
    static hasMany = [books: Book]
}

class Publisher {
    String name
    static belongsTo = [location: Location]
    static hasMany = [books: Book]
}

class Book {
    String title
    static belongsTo = [author: Author, publisher: Publisher]
}

class Srv1Service {

    static transactional = true

    def loadData() {
        def l1 = new Location(city: "London")

        def a1 = new Author(name: "Graham Greene")
        l1.addToAuthors(a1)

        def p1 = new Publisher(name: "Some Press")
        l1.addToPublishers(p1)

        def b1 = new Book(title: "The Comedians")
        a1.addToBooks(b1)
        p1.addToBooks(b1)

        l1.save()
    } 
}

如果我运行上面的loadData,Book实例将保存在Publisher实例之前,导致错误“not-null属性引用null或transient值:adhoc.Book.publisher”。

我尝试了各种不同的方式来定义关系,但收效甚微。我尝试了临时保存,这确实有效,但我可以看到父表更新,因为我保存了子数据 - 即位置,作者和发布者都更新到版本1.(而且我还想保留代码尽可能简单。)我想避免链接表格。

感谢任何建议!

1 个答案:

答案 0 :(得分:2)

好的,所以这里的关键是保存是从父级到子级的级联。在Book上你有一个问题,因为Book是发布者和作者的孩子。 GORM尝试保存位置,位置尝试保存作者,作者尝试保存书籍保存失败,因为Book有一个临时发布者。

在创建图书之前尝试添加中间保存:

def loadData() {
    def l1 = new Location(city: "London")

    def a1 = new Author(name: "Graham Greene")
    l1.addToAuthors(a1)

    def p1 = new Publisher(name: "Some Press")
    l1.addToPublishers(p1)
    l1.save() // add this save

    def b1 = new Book(title: "The Comedians")
    a1.addToBooks(b1)
    p1.addToBooks(b1)

    l1.save()
} 

我创建了一个本地Grails项目,并在此保存中添加了您的域类。级联正如您所期望的那样工作。