2016-08-29 2 views
1

В нашем приложении мы модернизировали от Hibernate 3.5.6-финала в 4.2.21.Final и теперь мы получаем ConcurrentModificationException, когда транзакция базы данных совершенны:ConcurrentModificationException при совершении сделки с Hibernate

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?

+1

Вы использовали прослушиватели событий Entity, выполняющие некоторые пользовательские работы (pre persit или post persist) – hunter

ответ

4

Исключение оказалось вызвано проблемой использования валидатора ограничений Hibernate, который мы используем. В валидаторе isValid выполнялся запрос критериев гибернации. Запрос вызвал сеанс сеанса Hibernate, который привел к ConcurrentModificationException. Мы исправили эту проблему путем временного отключения автоматического флеша в методе isValid:

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

Проблема может также проявляться как StackOverflowError.

1

У меня было это с hibernate 5.0.11 и проверено, что это произошло и с 5.2.5. Мое решение состояло в том, чтобы аннотировать пользовательский валидатор, чтобы открыть новую транзакцию.

@Transactional(propagation=Propagation.REQUIRES_NEW) 

Я думаю, спящий режим имеет еще некоторый путь, прежде чем заказ ограничения валидаторы сделаны легко установить и использовать, так как это заняло у меня намного больше времени, чем это необходимо.

Редактировать: проблема связана. Я думаю, что использование одной и той же транзакции нарушает спецификации jpa2.1 https://hibernate.atlassian.net/browse/HHH-7537

Смежные вопросы