2011-02-09 30 views
1

我正在使用Grails 1.3.6,並且遇到保存級聯問題時出現問題。問題是具有兩個父類的類。什麼我試圖簡化版本是這樣的:Grails/GORM以錯誤的順序保存

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,圖書實例被保存在發佈實例之前,導致錯誤「不空屬性引用null或瞬時值:adhoc.Book.publisher「。

我已經嘗試了各種不同的方式來定義關係,但很少成功。我已經嘗試過臨時保存,這確實有效,但是我可以看到,父表被更新爲我保存子數據 - 即位置,作者和發佈者都更新到版本1.(並且我想保留代碼儘可能簡單。)我想避免鏈接表。

任何建議感激地收到!

回答

2

好的,所以這裏的關鍵是保存級聯從父母到孩子。 Book對於Book來說有問題,因爲Book對於Publisher和Author都是一個孩子。 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項目與您的域名班在此保存加入。級聯工作正如你所期望的那樣。