2009-06-25 7 views
1

Je me bats pour obtenir une association juste sur Grails. Disons que j'ai deux classes de domaine:Sauvegarder les classes de domaine associées dans 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) 
    } 
} 

L'idée est que les utilisateurs peuvent créer des voitures sans créer un moteur, et les voitures sont un moteur par défaut. Dans le CarController je:

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]) 
    } 
} 

Lorsque vous essayez de sauver, je reçois une exception valeur nulle sur le champ Car.engine, donc évidemment le moteur par défaut n'est pas créé et enregistré. J'ai essayé de créer manuellement le moteur:

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]) 
    } 
} 

Ne fonctionne pas non plus. Grails n'est-il pas capable de sauvegarder les classes associées? Comment pourrais-je mettre en place une telle fonctionnalité?

+0

Pourriez-vous attribuer la valeur par défaut à travers la classe de domaine ??? Je pense à l'initialisation comme vous l'avez fait ci-dessus, mais peut-être pas à travers le contrôleur. – bsr

Répondre

2

Pour ce qui vaut la peine, je l'ai finalement cloué.

L'exception que je suis arrivé en essayant de sauver une voiture était

propriété non nulle référence à une valeur transitoire nulle ou

Il était évident que le moteur était nulle en essayant de sauver , mais pourquoi? Il s'avère que vous devez faire:

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

Comme le moteur n'appartient à une voiture, vous ne recevez pas la cascade enregistrer/mise à jour/supprimer ce qui est bien dans mon cas. La solution consiste à enregistrer manuellement le moteur puis à sauvegarder la voiture.

+0

Impossible d'utiliser le comportement de mappage en cascade comme cela: static mapping = { engine cascade: 'all-delete-orphan' } – Thermech

3

Je pense que vous avez besoin d'un belongsTo dans votre moteur c.-à-

static belongsTo = [car:Car] 

Hope this helps.

Questions connexes