Когда мне нужно сохранить список объектов, и каждый объект должен быть сохранен в его собственной транзакции (так что, если кто-то не работает, они не все терпят неудачу), я делаю это следующим образом:
List<Book> books = createSomeBooks()
books.each { book ->
Book.withNewSession {
Book.withTransaction {TransactionStatus status ->
try {
book.save(failOnError: true)
} catch (ex) {
status.setRollbackOnly()
}
}
}
}
Я использую Book.withNewSession
, потому что, если одна книга не сохраняется и транзакция откатывается, сеанс будет недействительным, что предотвратит сохранение последующих книг. Однако есть несколько проблем с этим подходом:
- Это немного подробный
- Новый сеанс всегда будет создан для каждой книги, даже если предыдущая книга выполнена успешно.
Есть ли лучший способ? Одна из возможностей, которая возникла для меня, - это вложение-слияние Hibernate SessionFactory
и вместо этого сделайте это
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....?
}
}