2016-05-03 5 views
1

Ich habe ein Elternobjekt, das nur erstellt werden kann, wenn Kinder gültig sind. . Kinder können nach der Speicherung nur auf die ID verweisen (da die ID automatisch erhöht wird). SO speichere ich die Eltern und dann die Eltern den Kindern zu speichern. Wie rolle ich alle übergeordneten und alle untergeordneten Sicherungen zurück, die aufgetreten sind, wenn ein Kind nicht gespeichert werden konnte?Grails: Möglichkeit, ein Elternteil und Kinder in die Datenbank NUR zu speichern, wenn alle Validierungen bestehen

(Dies geschieht in einer Service-Schicht)

parent.save(flush:true); 
children.each{child-> 
    child.parent=parent; 
    if(!child.save(flush:true)){ 
      //how to roll back all previous child saves if any AND 
      //initial parent save also 
    } 
} 
+3

Stellen Sie sicher, dass der obige Code in einer transaktionalen Methode in einem Service vorhanden ist, und eine nicht behandelte Ausnahme auslösen. Dies führt dazu, dass die Transaktion alle in der Methode durchgeführten Speichervorgänge rückgängig macht. –

+0

Vielen Dank. Plain Exception oder RuntimeException oder spielt es eine Rolle? – user2782001

+0

Egal, jede Ausnahme, die nicht gefangen wird, wird tun. –

Antwort

2

Wenn Sie die Transaktion wird alles Rollback eine abgefangene Ausnahme in einer Transaktionsdienst werfen. Etwas wie folgt aus:

package com.example 

class MyService { 

    static transactional = true 

    void myMethod() { 
     parent.save(flush:true) 
     children.each{child-> 
     child.parent = parent 
     if(!child.save(flush:true)){ 
      throw new RuntimeException('Rollback') 
     } 
    } 
    } 
} 

Persönlich würde ich nicht eine RuntimeException in Produktionscode verwenden. Ich würde meine eigene Ausnahme erstellen und vermeiden, in diesem Fall den Stacktrace auszufüllen. Zum Beispiel zeigt das obige jedoch, was Sie tun möchten.