То, когда В спящем режиме, сбрасывает Сессию, как она решает, какие объекты на сессии грязны?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

17
задан Vlad Mihalcea 17 February 2016 в 14:54
поделиться

3 ответа

Будьте в спящем режиме/может поколение байт-кода использования (CGLIB) так, чтобы это знало, что поле грязно, как только Вы называете метод set (или даже присваиваете полю afaict).

Это сразу отмечает то поле/объект как грязное, но не сокращает количество объектов, которые должны быть грязно проверены во время сброса. Все, что это делает, повлиять на реализацию org.hibernate.engine.EntityEntry.requiresDirtyCheck(). Это все еще делает сравнение поля полем для проверки на грязь.

я говорю вышеупомянутое на основе недавнего трала через исходный код (3.2.6GA) с любым доверием, которое добавляет. Интересные места:

  • SessionImpl.flush() триггеры onFlush() событие.
  • SessionImpl.list() вызовы autoFlushIfRequired(), который инициировал onAutoFlush() событие. (на таблицах процентов). Таким образом, запросы могут вызвать сброс. Интересно, никакой сброс не происходит, если нет никакой транзакции.
  • Оба тех события в конечном счете заканчиваются в AbstractFlushingEventListener.flushEverythingToExecutions(), который заканчивается (среди других интересных местоположений) в flushEntities().
  • , Что циклы по каждому объекту на сессии (source.getPersistenceContext().getEntityEntries()) вызов DefaultFlushEntityEventListener.onFlushEntity().
  • Вы в конечном счете заканчиваете в [1 110]. Тот метод действительно делает некоторую оптимизацию wrt к грязным флагам CGLIB, но мы все еще закончили цикличное выполнение по каждому объекту.
22
ответ дан 30 November 2019 в 12:45
поделиться

Будьте в спящем режиме берет снимок состояния каждого объекта, который загружается в Сессию. На сбросе каждый объект на Сессии по сравнению с ее соответствующим снимком для определения, которые грязны. SQL-операторы выпущены как требуется, и снимки обновляются для отражения состояния (теперь чистый) объекты Сессии.

5
ответ дан 30 November 2019 в 12:45
поделиться

Смотрите к org.hibernate.event.def. DefaultFlushEntityEventListener.dirtyCheck, который Каждый элемент на сессии переходит к этому методу, чтобы определить, грязно ли это или не путем сравнения нетронутой версии (один от кэша или один от базы данных).

1
ответ дан 30 November 2019 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: