Почему Hibernate выполняет только автоматическую очистку внутри транзакции?

В чем причина такого поведения?

Если по какой-то причине я выполняю две подходящие операции вне транзакции (не рекомендуется, я знаю!) И настроил 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 - это плохо».

5
задан Community 23 May 2017 в 12:26
поделиться