Сохранение связанных классов предметной области в 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 не может сохранять связанные классы? Как я мог реализовать такую ​​​​функцию?


person Cesar    schedule 25.06.2009    source источник
comment
Не могли бы вы назначить по умолчанию через класс домена??? я думаю инициализация так, как вы сделали выше, но может быть не через контроллер.   -  person bsr    schedule 29.04.2010


Ответы (2)


Я думаю, вам нужно, чтобы в вашем движке, т.е.

static belongsTo = [car:Car]

Надеюсь это поможет.

person Scott Warren    schedule 30.04.2010

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

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

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

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

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

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

person Cesar    schedule 26.06.2009
comment
Разве мы не можем использовать поведение каскадного сопоставления следующим образом: статическое сопоставление = {engine cascade: 'all-delete-orphan'} - person Thermech; 10.05.2013