在我们的应用程序中,我们已经从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的已知问题吗?
原因是我们使用的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.
| 归档时间: |
|
| 查看次数: |
3448 次 |
| 最近记录: |