1

Grailsで関連付けを正しく取得するのに苦労しています。2 つのドメイン クラスがあるとします。

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 フィールドで null 値の例外が発生するため、明らかにデフォルトのエンジンが作成および保存されません。エンジンを手動で作成しようとしました:

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

エンジンに属している必要があると思います。つまり

static belongsTo = [car:Car]

お役に立てれば。

于 2010-04-30T04:36:18.350 に答える
2

何が価値があるのか​​ 、私はついにそれを釘付けにしました.

車を救おうとしたときに得た例外は

null 以外のプロパティが null または一時的な値を参照している

保存しようとしたときにエンジンが null であることは明らかでしたが、なぜでしょうか? あなたがしなければならないことがわかりました:

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

エンジンは車に属していないため、カスケードの保存/更新/削除を取得できません。これは私の場合は問題ありません。解決策は、手動でエンジンを保存してから、車を保存することです。

于 2009-06-26T03:03:52.527 に答える