Когда мне нужно сохранить список объектов, и каждый объект должен быть сохранен в его собственной операции (так что если один сбой не все они не в состоянии), я делаю это так:Обработка транзакций Grails программного
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....?
}
}
Зачем вам нужно создавать новый сеанс для каждой итерации? IMHO достаточно для выполнения только с блокомTransaction на каждой итерации, но все может произойти за один сеанс. – lukelazarovic
@lukelazarovic Мне нужен только новый сеанс, если произойдет откат. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как создать новый сеанс в блоке catch. –