2009-06-25 12 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) 
    } 
} 

アイデアは、ユーザーが最初にエンジンを作成せずに車を作成することができ、それらの車は、デフォルトのエンジンを得ることです:のは、私は2つのドメインクラスがあるとしましょう。 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は関連するクラスを保存できませんか?どのように私はそのような機能を実装できますか?

+0

ドメインクラスを使用してデフォルトを割り当てることはできますか?私は上記のやり方で初期化を考えていますが、コントローラーではないかもしれません。 – bsr

答えて

2

私はついにそれを釘付けにしました。

車を保存しようとしたときに私が得た例外だった

-nullでないプロパティがnullまたは 過渡値を参照

エンジンが保存しようとしたときにはnullだったことは明らかだった

、 しかし、なぜ?あなたがしなければならないが判明:

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

エンジンは車に属していないので、あなたはカスケードが私の場合は罰金である/更新/削除を保存し得ることはありません。解決方法は、エンジンを手動で保存して車を保管する方法です。

+0

このようなカスケードマッピング動作を使用することはできません: static mapping = { エンジンカスケード: 'すべて削除孤児' } – Thermech

3

私はあなたのエンジン内のbelongsToすなわち

static belongsTo = [car:Car] 

・ホープこのことができますが必要だと思います。

関連する問題