среда, 19 мая 2010 г.

Hibernate+Collections+N*Thread = ConcurrentModificationException

При сохранении ентитей, содержащих коллекции из нескольких трэдов, возможно ConcurrentModificationException. Вне зависимости от секций синхронизации(с.с.), присутствующих внутри транзакции( типа TransactionTemplate tt = new TransactionTemplate(entityManager.getTransactionManager());), итерации по колециям выполняются вне с.с. при сохранении в базу. Чтобы гарантировать отсутствие ConcurrentModificationException необходимо включить в секцию синхронизации всю транзакцию.