在Grails中保存关联的域类

时间:2009-06-25 03:14:38

标签: grails groovy aggregation

我很难在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无法保存关联的类吗?我怎么能实现这样的功能?

2 个答案:

答案 0 :(得分:3)

我认为你的引擎需要一个belongsTo,即

static belongsTo = [car:Car]

希望这有帮助。

答案 1 :(得分:2)

为了什么值得,我终于把它钉了。

我试图保存汽车时遇到的例外是

  

not-null属性引用null或   瞬态值

很明显,尝试保存时引擎为空,但为什么呢?事实证明你必须这样做:

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

由于引擎不属于Car,因此您不会获得级联保存/更新/删除,这在我的情况下很好。解决方案是手动保存引擎,然后保存汽车。