2011-02-09 2 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, экземпляр книги сохраняется до экземпляра Publisher, в результате ошибки «не-нулевое свойство ссылается на нулевое или переходное значении : adhoc.Book.publisher ".

Я пробовал различные способы определения отношений с небольшим успехом. Я пробовал временные сбережения, и это работает, но я вижу, что родительские таблицы обновляются, когда я сохраняю дочерние данные - то есть местоположение, автор и издатель все обновляется до версии 1. (И также я хотел бы сохранить код насколько я могу.) Я хотел бы избежать связывания таблиц.

Любые советы с благодарностью получены!

ответ

2

Хорошо, поэтому ключ здесь заключается в том, что сэкономленные каскады от родителя к детям. У вас есть проблема, когда дело доходит до книги, потому что книга - это ребенок как для издателя, так и для автора. GORM пытается сохранить местоположение, местоположение пытается сохранить автора, автор пытается сохранить книгу BUT сохранение не выполняется, потому что книга имеет временный 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 с вашими классы домена, добавив в это сохранить. Каскадирование работает так, как вы ожидали.