Image

Imagecheremnov wrote in Imageru_java

Exception "possible nonthreadsafe access to session" в Hibernate

Инструменты: Java 1.5, Hibernate 3.2

Проблема:

При transaction.commit() получаем -
ERROR: [org.hibernate.AssertionFailure] - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: possible nonthreadsafe access to session

Причина:
Получению данного exception предшествует модификация
и последующий вызов evict(...) для объекта в рамках одной транзакции.
Более сложный случай, когда проводится вставка коллекционного объекта
и последующий вызов evict(...) для родительского объекта в рамках одной транзакции.
"possible nonthreadsafe access to session" кидают в частности методы execute() классов
EntityInsertAction, EntityUpdateAction, EntityDeleteAction из пакета
org.hibernate.action, таким образом:

public void execute() throws HibernateException {
...
EntityEntry entry = session.getPersistenceContext().getEntry( instance );
if ( entry == null ) {
throw new AssertionFailure( "possible nonthreadsafe access to session" );
}
...
}

Решение:
В случае, если изменения должны быть сохранены, вызвать session.flush() перед evict(...).

Совет: просмотреть в режиме отладки объекты, участвующие в CRUD операциях можно в
session.persistenceContext в коллекционных атрибутах: entitiesByKey, entityEntries, collectionEntries, collectionsByKey и пр.