Почему сеанс Hibernate все еще открыт после фиксации транзакцииJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему сеанс Hibernate все еще открыт после фиксации транзакции

Сообщение Anonymous »

Я был озадачен, когда создание проекции из лениво загруженной коллекции сущностей не вызывало исключение LazyInitializationException при возврате ответа DTO из метода обновления службы REST без сохранения состояния.
Поэтому я проверил и сеанс Hibernate Session был открыт даже после завершения транзакции и больше не был активен (согласно распечатке):

Код: Выделить всё

@ResponseStatus(HttpStatus.OK)
@ResponseBody
@PutMapping(value = "/{employeeId}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public EmployeeDto updateEmployee( @PathVariable Long employeeId, @Valid @RequestBody UpdateEmployeeDto updateEmployeeDto) {
Employee employee = employeeService.updateEmployee(employeeId, updateEmployeeDto);
System.out.println("Transaction Active: " +
TransactionSynchronizationManager.isActualTransactionActive()); // prints false
Session hibernateSession = entityManager.unwrap(Session.class);
System.out.println("Hibernate Session Open: " + hibernateSession.isOpen()); //prints true
return employeeMapper.toDto(employee);
}
Я понял, что по умолчанию управление сеансами в Spring тесно связано с транзакционным контекстом, т. е. область действия сеанса ограничена текущей транзакцией базы данных. Так почему же он не закрылся после запуска предыдущей фиксации tx?
В методе обновления сотрудника используется пустой @Transactional, и не применяется расширенный контекст персистентности.
Я помню, как получал LazyInitExceptions при преобразовании в проекции DTO из предыдущих проектов. Должно быть, я что-то упускаю, хотя для управления транзакциями/сессиями в этом проекте не было специальной настройки.

Подробнее здесь: https://stackoverflow.com/questions/778 ... -committed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»