В чем причина такого поведения?
Если по какой-то причине я выполняю две подходящие операции вне транзакции (не рекомендуется, я знаю!) И настроил Hibernate на автоматическую очистку, я бы ожидал, что он будет автоматически очищен, если вторая операция будет тот, который должен запускать автоматический сброс (например, список
, итерация
, или executeUpdate
).
Именно это и произошло бы, если бы не явная проверка второй строки метода autoFlushIfRequried
:
protected boolean autoFlushIfRequired(Set querySpaces) throws HibernateException {
errorIfClosed();
if ( ! isTransactionInProgress() ) {
// do not auto-flush while outside a transaction
return false;
}
AutoFlushEvent event = new AutoFlushEvent(querySpaces, this);
AutoFlushEventListener[] autoFlushEventListener = listeners.getAutoFlushEventListeners();
for ( int i = 0; i < autoFlushEventListener.length; i++ ) {
autoFlushEventListener[i].onAutoFlush(event);
}
return event.isFlushRequired();
}
Обновление : Спасибо axtavt за обнаружение Проблема гибернации, вызвавшая это изменение (в 3.2): FlushMode.AUTO -> COMMIT, когда вне транзакции .
Связанная проблема все еще открыта: задержка вставки IDENTITY в случае FlushMode. РУКОВОДСТВО / НИКОГДА , но ни одно из этих обсуждений не дает оснований говорить: «При работе вне транзакции FlushMode.AUTO - это плохо».