1

我正在努力在 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 不能保存关联的类吗?我怎样才能实现这样的功能?

4

2 回答 2

3

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

static belongsTo = [car:Car]

希望这可以帮助。

于 2010-04-30T04:36:18.350 回答
2

对于什么是值得的,我终于钉了它。

我在试图拯救汽车时遇到的例外是

非空属性引用空值或瞬态值

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

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

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

于 2009-06-26T03:03:52.527 回答