【发布时间】:2014-03-15 09:07:42
【问题描述】:
当我需要保存一个对象列表,并且每个对象都应该保存在它自己的事务中(这样如果一个失败,它们不会全部失败),我会这样做:
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....?
}
}
【问题讨论】:
-
为什么需要为每次迭代创建一个新会话?恕我直言,在每次迭代中只执行 withTransaction 块就足够了,但所有这些都可以在一个会话中发生..
-
@lukelazarovic 如果发生回滚,我只需要一个新会话。我遇到的问题是我不知道如何在 catch 块中创建一个新会话
标签: hibernate grails transactions grails-orm