2009-07-12 5 views
2

J'ai 2 domaines .. maître et les détails.Comment faire pour attraper l'erreur dans addToTag() [grails]

Master{ 
String masterName; 
static hasMany=[details:Detail] 
} 

Detail 
{ 
    String detailName ; 
    static belongsTo =[master:Master]; 
} 

J'ai la forme qui manient la sauvegarde

def save = { 
..... 
def master = new Master(params); 
params.detailsName.eachWithIndex(dtName, index -> 
    def detail = new Detail(); 
    detail.detailName = dtName; 
    .... 
    master.addToDetails(detail); 
} 
    ..... 
master.save(flush:true); 
} 

quand j'ai appelé master.save(), s'il y a des erreurs dans le détail, le maître encore les données d'économie. Je veux savoir comment annuler le maître s'il y a des erreurs dans les détails et je voudrais savoir comment suivre les erreurs dans les détails?

merci

Répondre

3

Une transaction est ce dont vous avez besoin. Vous pouvez effectuer l'enregistrement dans un service. Dans les services avec transaction = true, toutes les méthodes sont enveloppées dans les transactions et il y aura une annulation automatique si une exception est levée:

class MasterService { 

    boolean transactional = true 

    def save(...) { } 
} 

Ou vous pouvez utiliser la fermeture withTransaction dans votre contrôleur pour envelopper votre code dans une transaction si vous ne voulez pas créer un service.

+0

J'ai fait une transaction, mais je ne sais pas comment savoir qu'il y a erreur/détail n'est pas valide pour être inséré (peut être le nom est vide ou la date est null etc). autant que je sache, quand le détail n'était pas valide, l'en-tête toujours inséré et le détail provoqué n'ont pas pu être sauvés. Une fois ajouté à *(), il attachera l'objet sans déclencher d'erreur. mais quand vous enregistrez() le détail ne sera pas sauvegardé s'il y a des erreurs et je ne peux pas obtenir le message d'erreur. – nightingale2k1

+0

Vous pouvez vérifier detail.validate() et si faux vous pouvez vérifier les erreurs en utilisant detail.errors.each {log.debug it}. –

Questions connexes