java - 使用 Hibernate 提交事务时出现 ConcurrentModificationException

标签 java hibernate

在我们的应用程序中,我们已从 Hibernate 3.5.6-final 升级到 4.2.21.Final,现在提交数据库事务时我们会收到 ConcurrentModificationException:

java.util.ConcurrentModificationException: null
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:386)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:304)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:349)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1195)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)

这是 Hibernate 4.2 的已知问题吗?

最佳答案

事实证明,该异常是由我们使用的 Hibernate 自定义约束 validator 的问题引起的。 validator 的 isValid 正在运行 Hibernate 标准查询。该查询触发了 Hibernate session 刷新,从而导致 ConcurrentModificationException。我们通过在 isValid 方法中暂时禁用自动刷新来修复该问题:

@Override
public boolean isValid(Object object, final ConstraintValidatorContext c) {
   try {
      sessionFactory.getCurrentSession().setFlushMode(FlushMode.MANUAL);
      ...
   } finally {
      sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
   }
}

该问题也可能表现为 StackOverflowError

关于java - 使用 Hibernate 提交事务时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202276/

相关文章:

java - 数组操作,在末尾添加元素,将其他元素推后

java - Hibernate Criteria - 新手问题二

java - 如何在列表中存储结果集并在 HQL 语句中迭代具有实体属性的列表?

java - 在桌面应用程序中使用 JPA 实现?

java - 如何创建一个 void 函数来列出 13 号下一个 13 星期五

java - 运行 jar 文件/.class 文件以及属性文件

java - 并行下载嵌入式资源导致 JMeter 测试连接超时

mysql - 是否可以在 Java 代码中实现数据库 'trigger'? (hibernate + jpa + spring + mysql)

java - hibernate 从附加父级中删除子级

java - @NamedNativeQuery - 如何将它绑定(bind)到存储库方法?