вот контекст:
В настоящее время мы пишем приложение, основанное на веб-технологиях (гибкий интерфейс). На стороне сервера реализован Java, использующий Hibernate для ORM.
Специфика этого приложения заключается в том, что оно реализует диалог с пользователем. Это означает, что пользователь открывает диалог и, прежде чем он решит сохранить (или отменить) диалог, он выполняет много операций над объектами, которые отображаются как спящие сущности.
Например:
- открыть разговор
- создать объект A
- сохранить в сеансе
- запросить его
- обновить
- и т.д ...
- сохранить разговор (очистить сеанс ...)
и затем начинается другой цикл разговора.
Мы естественным образом выбрали шаблон сеанса для разговора, чтобы реализовать этот способ работы.
Напомню принцип:
сеанс гибернации создается один раз, когда пользователь решает начать диалог, его режим сброса устанавливается на РУЧНОЙ, и с этого момента он отключается между каждой транзакцией, пока пользователь не решит завершить диалог, который является единственным временем, когда мы явно сбрасываем сеанс (и так записать данные из сеанса в БД).
Редактировать
В шаблоне сеанса на разговор каждая операция выполняется в транзакции, которая была зафиксирована. Например, допустим, у нас есть две службы: одна называется addObject (), а другая - getObject ().
Процесс следующий:
- открыть диалог (=> сеанс создан с режимом сброса, установленным на MANUAL, и связать его в ManagedSessionContext, который содержал текущий сеанс)
- вызов службы addObject (), которая получает сеанс диалога, открывает транзакцию, создает объект, сохраняет его, отключает сеанс и, наконец, фиксирует транзакцию
- вызов службы getObject (), которая получает сеанс диалога, открывает транскрипцию, получает объект, отключает сеанс и, наконец, фиксирует транзакцию
- сохранить диалог, открыв транзакцию, сбросив сеанс и затем совершив транзакцию.
Здесь мы видим, что я не могу очистить сеанс без фиксации транзакции, потому что цель состоит в том, чтобы точно зафиксировать транзакцию после каждой сервисоподобной операции.
У нас не было никаких проблем, пока мы не захотели запросить какие-то неразделенные сущности! Потому что, если мы хотим использовать этот тип разговора, это потому, что мы хотим находиться в состоянии «симуляции», пока мы явно не очистим сеанс.
Но похоже, что неотключенные сущности не могут быть загружены с использованием критериев гибернации или HQL, за исключением случаев, когда в сеансе выполняется flush (), что приводит к потере всех преимуществ от шаблона сеанса на разговор ...
Итак, мой вопрос:
Можем ли мы настроить это поведение? (т.е. мы можем включить запрос события кэша сеанса, если сеанс не очищен?)
Поскольку кажется, что ответ отрицательный (приветствуется любой противник!), 2-й вопрос:
Есть ли умный способ сделать это самостоятельно, не извращая, вероятно, умный и продуманный способ работы в спящем режиме?
Надеясь, что мой английский понятен, я заранее всех благодарю.
(Позвольте мне уточнить, что этот вопрос также был опубликован на форуме пользователей спящего режима)
Ben