【问题标题】:Grails/GORM saves in the wrong orderGrails/GORM 以错误的顺序保存
【发布时间】:2011-06-24 06:04:24
【问题描述】:

我正在使用 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 property references a null or transient value: adhoc.Book.publisher”。

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

任何建议都非常感谢!

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    好的,这里的关键是保存是从父级级联到子级的。当涉及到 Book 时,您会遇到问题,因为 Book 是 Publisher 和 Author 的孩子。 GORM 尝试保存 Location,Location 尝试保存 Author,Author 尝试保存 Book 但是保存失败,因为 Book 有一个临时的 Publisher。

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

    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 项目,并在此保存中添加了您的域类。级联工作如您所料。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2022-10-01
      • 1970-01-01
      • 2018-11-16
      相关资源
      最近更新 更多