Подтвердить что ты не робот

Спящий режим: обновление, выселение, репликация и сброс

Мне жаль, что я не знал, что именно делает каждый элемент в этом списке, как он работает, каковы последствия и время правильного использования.

  • Обновить
  • выселить
  • Репликация
  • Flush

Мне даже интересно, что каждый делает, но я не совсем уверен, поэтому я прошу вас о помощи, потому что я действительно хочу это понять.

Я знаю, что это довольно общий вопрос, но я думаю, что очень полезно знать обо всем этом.

Спасибо.

4b9b3361

Ответ 1

Hibernate Documentation дает хорошие примеры. Также этот пост в блоге даст вам некоторое представление. Я добавлю следующую строку ниже.

В любой момент можно повторно загрузить объект и все его коллекции с помощью метода refresh(). Это полезно, когда триггеры базы данных используются для инициализации некоторых свойств объекта.

sess.save(cat);
sess.flush(); //force the SQL INSERT
sess.refresh(cat); //re-read the state (after the trigger executes)

см. здесь для получения дополнительных примеров.

Всякий раз, когда вы передаете объект в save(), update() or saveOrUpdate(), и всякий раз, когда вы извлекаете объект с помощью load(), get(), list(), iterate() or scroll(), этот объект добавляется во внутренний кэш сеанса.

При вызове flush() состояние этого объекта будет синхронизироваться с базой данных. Если вы не хотите, чтобы эта синхронизация возникла, или если вы обрабатываете огромное количество объектов и должны эффективно управлять памятью, метод evict() может быть использован для удаления объекта и его коллекций из кеша первого уровня.

ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
while ( cats.next() ) {
    Cat cat = (Cat) cats.get(0);
    doSomethingWithACat(cat);
    sess.evict(cat);     //  (if gives the compile time error then use it: sess.evict(cat.getClass());  
}

Прочтите полный пример из здесь.

Ознакомьтесь с описанием API сеанса здесь.

Ответ 2

replicate() предназначен для использования вместо save()/persist(), когда вам нужно сохранить объект с данным идентификатором, несмотря на то, что идентификатор указанного объекта настроен на создание.

Полезно, когда некоторые из сущностей (возможно, исходящие из внешних систем) имеют уже существующие идентификаторы, тогда как другим объектам того же типа нужны их идентификаторы, которые должны быть сгенерированы.

Однако из-за давней ошибки в Hibernate (HHH-1459, HHH-2716) replicate() не работает должным образом с некоторыми типами генераторов id. Эта проблема ограничивает полезность replicate() и требует, чтобы вы реализовали неприятные обходные пути для эмуляции ее поведения, если ваша стратегия генерации идентификатора затронута, и вы не можете ее изменить.

Ответ 3

  • session.flush() Промывка сеанса вынуждает Hibernate синхронизировать состояние сессии в сеансе с базой данных.
  • session.evict() Отделить объект от кеша сеанса. После отсоединения объекта от сеанса любое изменение объекта не будет сохранено.
  • session.refresh() Перезагрузите все данные.
  • session.replicate() Данные реплицируются в разных Datastore в разных режимах.