hibernate - 列表中一个域对象上的StaleObjectStateException会影响所有剩余的更新

标签 hibernate grails gorm

我在Grails中有一个Quartz作业,该作业会迭代我的用户并每晚对每个用户进行更新。但是,如果我在更新用户对象时得到StaleObjectStateException,则此后的每次更新似乎都会获得相同的StaleObjectStateException。像这样:

def users = User.list()
users.each { user ->
  try {
    user.doUpdate()
    user.save()
  } catch (all) {
    // I end up here for every user object after a StaleObjectStateException
  }
}

我该如何恢复?我不介意零星的失败(理想情况下,我会收集这些错误并在末尾再试一次),但是现在这实际上停止了所有剩余的更新。

最佳答案

理想情况下,您应该在新事务中进行每次更新/保存,否则任何失败都会影响整个事务/休眠 session 。因为每次更新/保存都应该是它自己的原子操作,所以这样做更有意义。

您还应该获取事务内的每个域对象。

def userIds = User.withCriteria {
  projections {
    property("id")
  }
}
userIds.each { userId ->
    User.withTransaction {
      try {
        def user = User.get(userId)
        user.doUpdate()
        user.save()
      } catch (all) {
        // do whatever.
      }
    }
}

关于hibernate - 列表中一个域对象上的StaleObjectStateException会影响所有剩余的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27878087/

相关文章:

jquery-ui - Grails:如何使jQuery-UI的所有功能正常工作?

hibernate - 在GGTS中映射一对多关系

mysql - Spring Data JPA 和 MySQL : How to avoid "duplicate entry" error in multithreaded environment?

mysql - MySQL/Hibernate 中的重复条目错误

java - Dropwizard - Postgresql - Hibernate 映射时间戳与 LocalDateTime 上的时区

unit-testing - 如何模拟 Grails 中 'src' 文件夹中的类(单元测试)

java - 如何在java中进行整数枚举声明

authentication - 如何正确使用groovyx.net.http.RESTClient中的get方法

grails - 在命名查询中访问对象的属性

grails - 等同于SQL的Gorm