在我们的应用程序中,我们已从 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/