与Hibernate一起提交事务时出现ConcurrentModificationException

sak*_*kra 2 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)
Run Code Online (Sandbox Code Playgroud)

这是Hibernate 4.2的已知问题吗?

sak*_*kra 6

原因是我们使用的Hibernate自定义约束验证器出现问题.验证器isValid正在运行Hibernate条件查询.该查询触发了Hibernate会话刷新,导致了ConcurrentModificationException.我们通过在isValid方法中暂时禁用自动刷新来解决问题:

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

这个问题也可能表现为一个问题StackOverflowError.