Manejo de transacciones de Grails mediante programación
Cuando necesito guardar una lista de objetos, y cada objeto debe guardarse en su propia transacción (de modo que si uno falla no todos fallan), lo hago así:
List<Book> books = createSomeBooks()
books.each { book ->
Book.withNewSession {
Book.withTransaction {TransactionStatus status ->
try {
book.save(failOnError: true)
} catch (ex) {
status.setRollbackOnly()
}
}
}
}
yo sueloBook.withNewSession
porque si un libro no se guarda y la transacción se revierte, la sesión no será válida, lo que evitará que se guarden libros posteriores. Sin embargo, hay un par de problemas con este enfoque:
¿Hay una mejor manera? Una posibilidad que se me ocurrió es inyectar dependencia al HibernateSessionFactory
y hacer esto en su lugar
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....?
}
}