Какова цель метода session.lock в Hibernate

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

 p1  = (Person)session. get(Person.class,1);// person name is scott here
// here peson name got update to henry by anothet thread
session. lock(person, LockMode.READ) line 3
// still name is henry too

Я пробовал над фрагментом кода, но он не читал человека из базы данных в строке 3. В документации говорится, что это можно использовать для проверки версии.

Не знаете, как он проверяет версию и помогает разработчику в любом сценарии?

Точно не уверен, что достигнет session.lock(person, LockMode.None). Документация говорит, что LockMode.NONE используется для простого повторного связывания временного экземпляра с сеансом.

Не уверен, что это значит, перераспределяя временный экземпляр с сеансом. Краткий сценарий будет большой помощью?

Ответ 1

Различные блокирующие режимы предназначены для предотвращения изменения объекта и чтения из нескольких источников одновременно, см. запись документации о пессимистическая блокировка для деталей. По моему опыту, они редко нужны, так как уровень изоляции базы данных обычно позаботится о блокировке по мере необходимости:

Не предполагается, что пользователи тратят много времени на блокировку стратегии. Обычно достаточно указать уровень изоляции для JDBC, а затем просто дайте базе данных выполнить всю работу. Однако продвинутые пользователи могут захотеть получить эксклюзивные пессимистические блокировки или повторно получить блокировки в начале новой транзакции.

Что касается "повторного связывания временного экземпляра с сеансом" (я на самом деле думаю, что это подразумеваемый отдельный экземпляр?), рассмотрим следующее изображение (Жизненный цикл сущности гибернации):

Hibernate entity lifecycle

Это описание из Документация сообщества Hibernate:

Hibernate определяет и поддерживает следующие состояния объектов:

  • Transient - объект является временным, если он только что был создан используя новый оператор, и он не связан с Hibernate Сессия. Он не имеет постоянного представления в базе данных, и нет значение идентификатора было присвоено. Временные экземпляры будут уничтожается сборщиком мусора, если приложение не содержит ссылка больше. Используйте сеанс Hibernate для создания объекта persistent (и пусть Hibernate позаботится о операторах SQL, которые необходимо выполнить для этого перехода).
  • Постоянный - постоянный экземпляр имеет представление в базе данных и значение идентификатора. Это может быть просто сохранено или загружено, однако по определению в рамках Сессии. Hibernate обнаружит любые изменения, внесенные в объект в постоянном состоянии и синхронизировать состояние с при завершении работы единицы измерения. Разработчики не выполняют операторы UPDATE или инструкции DELETE, когда объект должен быть преходящим.
  • Отдельно - отдельный экземпляр - это объект, который была постоянной, но ее сессия была закрыта. Ссылка на объект все еще действителен, конечно, и отсоединенный экземпляр может даже в этом состоянии. Отдельный экземпляр может быть подключен повторно к новому сеансу в более поздний момент времени, делая это (и все изменения). Эта функция позволяет программировать модель для длительных периодов работы, требующих времени мышления пользователя. Мы называть их транзакциями приложений, т.е. единицей работы из точки зрения пользователя.