Контекст / настройка
Мы используем шаблон фильтра открытого сеанса в разговоре в нашем приложении с интеграцией Spring и Hibernate.
Мы используем декларативное управление транзакциями Springs с использованием org.springframework.transaction.interceptor.TransactionProxyFactoryBean.
Когда приложение получает запрос, мы выполняем несколько операций с базой данных (вставка / обновления), где обновление и вставки отдельно сбрасываются в базу данных, и транзакция фиксируется.
Проблема
Скажем, для одной из вставок / обновлений возникает исключение базы данных, сеанс гибернации закрывается, как ожидалось, поскольку сеанс находится в недопустимом состоянии.
Даже после этого, если я не хочу возвращать запрос обратно и хочу продолжить свой запрос и выполнить другие действия, я не могу, потому что сеанс закрыт, и любые последующие вызовы в этом сеансе завершаются сбоем, и это очевидно, почему.
Мне нужна помощь в написании решения, в котором я могу закрыть существующий сеанс и открыть новый и присоединить последний сеанс к потоку с помощью TransactionSynchronizationManager, но не знаю, как это сделать, поскольку есть много мест, где мне может потребоваться это сделать в flow, есть ли общий способ сделать это? И это вообще правильный дизайн?
И даже если я достигну этого, как насчет сущностей, которые были отсоединены от предыдущего сеанса, как я могу автоматически подключиться к новому сеансу, чтобы прокси-серверы работали без проблем?




We are using open-session-in-conversation-filter pattern in our application w/ Spring & Hibernate integration.
Шаблон COnversation, как и расширенный контекст сохранения в Java EE, работает точно так же, как вы описали здесь. Если вы получите Exception, вам придется все отбросить и начать с нуля.
Теперь, если вам нужна большая гибкость, вы можете просто использовать отсоединенные объекты и использовать новый Session в каждом запросе, который будет объединять отсоединенные объекты.
Однако что, если состояние объекта всегда будет вызывать исключение? Как можно определить сущность и просто проигнорировать ее? Что, если он связан с другими объектами.
Поэтому простого решения этой проблемы нет. Что вы можете сделать:
HttpSession, Redis и т. д.Таким образом, пользователи не потеряют внесенные изменения и, основываясь на сообщении об ошибке, могут повторить попытку после внесения исправлений.
Да, вам придется сделать это вручную. Вот почему вам лучше сделать то, что я вам предлагал.
спасибо Влад за быстрый ответ. Я имел в виду другую проблему, когда я хочу продолжить выполнение того же запроса, даже если одно из моих обновлений не удалось, и продолжить другие действия, но для этого мне нужно создать новый сеанс и прикрепить к нему все объекты . Нужно ли это делать вручную, потому что у меня может не быть отслеживания всех сущностей в более старом сеансе? и есть ли класс общего места / шаблона, где я могу создать этот сеанс, чтобы любая из моих транзакций не удалась, я должен был создать новый сеанс?