2009-06-25 2 views
1

Я изо всех сил пытаюсь получить связь прямо на Grails. Скажем, у меня есть два класса домена:Сохранение связанных классов домена в Grails

class Engine { 
    String name 
    int numberOfCylinders = 4 
    static constraints = { 
     name(blank:false, nullable:false) 
     numberOfCylinders(range:4..8) 
    } 
} 

class Car { 
    int year 
    String brand 
    Engine engine = new Engine(name:"Default Engine") 
    static constraints = { 
     engine(nullable:false) 
     brand(blank:false, nullable:false) 
     year(nullable:false) 
    } 
} 

Идея заключается в том, что пользователи могут создавать автомобили без создания двигателя первой, и эти автомобили получают двигатель по умолчанию. В CarController у меня есть:

def save = { 
    def car = new Car(params) 
    if(!car.hasErrors() && car.save()){ 
     flash.message = "Car saved" 
     redirect(action:index) 
    }else{ 
     render(view:'create', model:[car:car]) 
    } 
} 

При попытке сохранить, я получаю исключение нулевого значения на поле Car.engine, поэтому очевидно, двигатель по умолчанию не создается и сохраняется. Я попытался вручную создать двигатель:

def save = { 
    def car = new Car(params) 
    car.engine = new Engine(name: "Default Engine") 
    if(!car.hasErrors() && car.save()){ 
     flash.message = "Car saved" 
     redirect(action:index) 
    }else{ 
     render(view:'create', model:[car:car]) 
    } 
} 

Не работает. Не позволяет ли Grails сохранить связанные классы? Как я мог реализовать такую ​​функцию?

+0

Не могли бы вы назначить по умолчанию класс домена ??? Я думаю, инициализация, как вы сделали выше, но может быть не через контроллер. – bsr

ответ

2

Для чего я, наконец, прибил его.

Исключение я получил, когда пытался спасти автомобиль был

не-нуль свойство ссылается на нулевое или переходное значении

Было очевидно, что двигатель был нулевым при попытке сохранить , но почему? Оказывается, что вам нужно сделать:

def car = new Car(params) 
car.engine = new Engine(name: "Default Engine") 
car.engine.save() 

Поскольку двигатель не относится к автомобилю, вы не получите каскад сохранения/обновления/удаления, который хорошо в моем случае. Решение состоит в том, чтобы вручную сохранить двигатель, а затем сохранить автомобиль.

+0

Можем ли мы использовать такое поведение каскадного отображения: static mapping = { engine cascade: 'all-delete-orphan' } – Thermech

3

Я думаю, что вам нужен belongsTo в двигателе, т.е.

static belongsTo = [car:Car] 

Надеется, что это помогает.

Смежные вопросы