2016-06-20 9 views
0

Speicher Ich habe ein Grails Domain-Objekt, das ich zu validieren und dann als solche sparen:Grails Domain-Instanz nicht

if(foo.hasErrors()) { 
    transactionStatus.setRollbackOnly() 
    respond foo.errors, view: 'create' 
    return 
} 

foo.save flush:true, failOnError:true 

println(foo) 

Es gibt keine Fehler auf dem Speicher gegeben. Aber wenn ich die println anrufe, sagt es, dass mein Objekt nicht gespeichert ist. Wenn ich jedoch die Datenbank überprüfe, wurde sie tatsächlich beibehalten. Gibt es etwas, das ich überprüfen kann, um mir zu sagen, warum Grails mir sagt, dass es nicht gespeichert ist? Die Grails-Version ist 3.0.9.

Nach weiteren Tests sieht es so aus, als ob es mit der Art und Weise zusammenhängt, wie ich den Schlüssel in meiner Domänenzuordnung angegeben habe.

Wenn ich das ID-Feld entfernen und Grails behandeln standardmäßig das Objekt wird ordnungsgemäß gespeichert. Wenn ich das ID-Feld zurück hinzufüge, hat es das oben beschriebene Problem. Gibt es einen Grund dafür?

+0

Haben Sie es debuggen oder nur von println überprüfen? Welche Version von Grails? Ist die Funktion @Transactional? –

+0

Ändert sich der Status, nachdem Sie die Transaktion bestätigt haben? –

+0

Dies ist Grails 3.0.9. Die Funktion war @Transactional, aber ich entfernte alle Transaktionsstücke und habe das gleiche Problem. – Lithium

Antwort

0

Ich wäre nicht zu besorgt über das Format toString(). Sie rufen save mit failOnError: true an, daher kann davon ausgegangen werden, dass eine Ausnahme ausgelöst wird, wenn die Persistenz fehlschlägt. Wenn Sie dieses Argument nicht angeben, können Sie, dass Ausdauer überprüfen wie gelingt es so

if (foo.save()) { 
    println 'it worked' 
} else { 
    println 'if failed' 
} 
+0

Ich war besorgt, weil ich Probleme hatte, wenn ich diesen Teil in einem späteren Schritt aktualisierte. Es würde versuchen, eine neue Instanz zu erstellen, anstatt das vorhandene zu aktualisieren, und ich dachte, dass dies vielleicht ein Teil des Problems war. Die Speichermethode gibt jedoch in der Tat wahr zurück. – Lithium

0

versuchen

foo = foo.save flush:true, failOnError:true 

println(foo) 
+1

Bitte bearbeiten Sie mit mehr Informationen. Code-only und "try this" Antworten werden abgeraten, da sie keine durchsuchbaren Inhalte enthalten und nicht erklären, warum jemand "das versuchen sollte". Wir bemühen uns, eine Ressource für Wissen zu sein. –