Wenn ich brauche eine Liste von Objekten zu speichern, und jedes Objekt sollte in einer eigenen Transaktion gespeichert werden (so dass, wenn man sie nicht nicht alle gescheitert), ich mache es wie folgt aus:Umgang mit Grails Transaktionen programmatisch
List<Book> books = createSomeBooks()
books.each { book ->
Book.withNewSession {
Book.withTransaction {TransactionStatus status ->
try {
book.save(failOnError: true)
} catch (ex) {
status.setRollbackOnly()
}
}
}
}
Ich benutze Book.withNewSession
, denn wenn ein Buch nicht speichern und die Transaktion zurückgesetzt wird, wird die Sitzung ungültig, die nachfolgende Bücher speichern zu verhindern. Es gibt jedoch ein paar Probleme mit diesem Ansatz:
- Es ist ein bisschen ausführliche
- Eine neue Sitzung wird immer für jedes Buch erstellt werden, auch wenn das vorherige Buch
gelungen Gibt es ein besserer Weg? Eine Möglichkeit, die mir aufgetreten ist abhängigkeits zu injizieren, um die Hibernate SessionFactory
und tun dies stattdessen
List<Book> books = createSomeBooks()
books.each { book ->
try {
Book.withTransaction {
book.save(failOnError: true)
}
} catch (ex) {
// use the sessionFactory to create a new session, but how....?
}
}
Warum sollten Sie für jede Iteration eine neue Sitzung erstellen? IMHO reicht aus, um nur mit Transaction Block in jeder Iteration auszuführen, aber alles kann in einer Sitzung passieren. – lukelazarovic
@lukelazarovic Ich brauche nur eine neue Sitzung, wenn ein Rollback auftritt. Das Problem, das ich habe, ist, dass ich nicht weiß, wie ich eine neue Sitzung im Catch-Block erstellen kann –