Hibernate сеанс на разговор и запрос неразделенных объектов - PullRequest
1 голос
/ 03 ноября 2010

вот контекст:

В настоящее время мы пишем приложение, основанное на веб-технологиях (гибкий интерфейс). На стороне сервера реализован Java, использующий Hibernate для ORM.
Специфика этого приложения заключается в том, что оно реализует диалог с пользователем. Это означает, что пользователь открывает диалог и, прежде чем он решит сохранить (или отменить) диалог, он выполняет много операций над объектами, которые отображаются как спящие сущности.

Например:

  • открыть разговор
  • создать объект A
  • сохранить в сеансе
  • запросить его
  • обновить
  • и т.д ...
  • сохранить разговор (очистить сеанс ...)

и затем начинается другой цикл разговора.

Мы естественным образом выбрали шаблон сеанса для разговора, чтобы реализовать этот способ работы.
Напомню принцип:
сеанс гибернации создается один раз, когда пользователь решает начать диалог, его режим сброса устанавливается на РУЧНОЙ, и с этого момента он отключается между каждой транзакцией, пока пользователь не решит завершить диалог, который является единственным временем, когда мы явно сбрасываем сеанс (и так записать данные из сеанса в БД).


Редактировать
В шаблоне сеанса на разговор каждая операция выполняется в транзакции, которая была зафиксирована. Например, допустим, у нас есть две службы: одна называется addObject (), а другая - getObject ().
Процесс следующий:

  • открыть диалог (=> сеанс создан с режимом сброса, установленным на MANUAL, и связать его в ManagedSessionContext, который содержал текущий сеанс)
  • вызов службы addObject (), которая получает сеанс диалога, открывает транзакцию, создает объект, сохраняет его, отключает сеанс и, наконец, фиксирует транзакцию
  • вызов службы getObject (), которая получает сеанс диалога, открывает транскрипцию, получает объект, отключает сеанс и, наконец, фиксирует транзакцию
  • сохранить диалог, открыв транзакцию, сбросив сеанс и затем совершив транзакцию.

Здесь мы видим, что я не могу очистить сеанс без фиксации транзакции, потому что цель состоит в том, чтобы точно зафиксировать транзакцию после каждой сервисоподобной операции.


У нас не было никаких проблем, пока мы не захотели запросить какие-то неразделенные сущности! Потому что, если мы хотим использовать этот тип разговора, это потому, что мы хотим находиться в состоянии «симуляции», пока мы явно не очистим сеанс. Но похоже, что неотключенные сущности не могут быть загружены с использованием критериев гибернации или HQL, за исключением случаев, когда в сеансе выполняется flush (), что приводит к потере всех преимуществ от шаблона сеанса на разговор ...

Итак, мой вопрос:

Можем ли мы настроить это поведение? (т.е. мы можем включить запрос события кэша сеанса, если сеанс не очищен?)

Поскольку кажется, что ответ отрицательный (приветствуется любой противник!), 2-й вопрос: Есть ли умный способ сделать это самостоятельно, не извращая, вероятно, умный и продуманный способ работы в спящем режиме?

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

Ben

1 Ответ

1 голос
/ 03 ноября 2010

Из Hibernate API

Очистка - это процесс синхронизации основного постоянного хранилища с постоянным состоянием, хранящимся в памяти.

Очистка не обязательно означает, что вы пишетеваши изменения в БД.Это означает, что состояние памяти актуально.Flush записывает изменения в БД только в том случае, если ваша БД не поддерживает транзакции или вы не работаете с транзакциями.

Если вы работаете с транзакциями, а ваша БД поддерживает транзакции, например, MySQL с InnoDB, вы можете выполнять сброс всякий разВам нравится, ничего не записывая в БД.Изменения не записываются в БД, пока вы не позвоните Transaction.commit().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...