Весь код выполняется внутри метода контроллера mvc в одном сеансе? - PullRequest
0 голосов
/ 07 января 2020

У меня есть следующая модель:

много ко многим между сущностями Foo и Bar. Foo имеет LinkedHashSet Bar с аннотацией @OrderBy.

Контроллер включает метод, который сначала сохраняет новый Бар в наборе, а затем получает весь Бар от одного Foo.

Set<Bar> methodName(FooId fid, Bar b){
    fooService.addBar(fid, b);
    return fooService.getBarsOfFoo(fid);
}

методы обслуживания:

@Transactional
void addBar(UUID fid, Bar b){
    Foo f = fooRepository.getFoo(fid);
    f.getBars().add(b);
}

@Transactional(readOnly = true)
Set<Bar> getBarsOfFoo(UUID fid){
    return fooRepository.getFoo(fid).getBars();
}

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

Оба метода сеанса из этого метода контроллера выполняются в одном и том же сеансе?

1 Ответ

1 голос
/ 07 января 2020

Сеанс Hibernate отличается от сеанса контроллера MVC из официальной документации https://developer.jboss.org/wiki/SessionsAndTransactions

Это зависит от вашей конфигурации, а также от того, кто и как вы ее создаете. сеанс

, но в принципе существует 3 шаблона

сеанс на запрос

шаблон реализации сеанса на запрос. Один сеанс и одна транзакция базы данных реализуют обработку конкретного события запроса (например, запроса Http в веб-приложении). Никогда не используйте анти-паттерн сеанс на операцию! (Существуют крайне редкие исключения, когда сеанс для каждой операции может быть подходящим, вы не столкнетесь с ними, если вы только изучаете Hibernate.)

сеанс на запрос с отсоединением -объекты

Как только постоянные объекты считаются отключенными во время обдумывания пользователем и должны быть повторно присоединены к новому сеансу после их изменения.

сеанс на разговор

В этом случае один сеанс имеет большую область действия, чем одна транзакция базы данных, и он может охватывать несколько транзакций базы данных. Каждое событие запроса обрабатывается в одной транзакции базы данных, но очистка сеанса будет отложена до конца диалога и последней транзакции базы данных, чтобы сделать атом атома c. Сессия находится в отключенном состоянии, без открытого соединения с базой данных, во время обдумывания пользователем. Автоматизация Hibernate c optimisti c контроль параллелизма (с управлением версиями) используется для обеспечения изоляции разговора.

Поэтому при просмотре документации вы, вероятно, используете сеанс на разговор, поэтому может потребоваться грипп sh ваш сеанс до вашего следующего звонка.

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