Как Spring Boot обрабатывает Hibernate Session?

В Spring Boot я вижу, что вам не нужно открывать и закрывать сеанс гибернации.

Но для понимания цели, как он работает внутри, на каком уровне он открывает сеанс гибернации и когда он закрывается.

Я создал один POC. У меня есть одно загрузочное приложение Spring, у него два Entity One - это Customer а другой - Address а между Customer и Address существует отношение один ко многим.

И у меня есть один два Apis, один добавляет запись, а другой загружает все записи. Эти APis есть в CustomerEndpoint, и это помечено

@RestController
@RequestMapping(value="/customer").

А также создал CustomerRepository который расширяет CrudRepository для сохранения и извлечения записей о Customer .

Так что, насколько я понимаю, при выборке Customer с помощью CustomerRepository внутри класса CustomerEndpoint следует выдавать ошибку LazyInitialization, когда мы скажем customer.getAddress (так как его тип выборки - LAZY). Но он не выдает никакой ошибки, он работает правильно.

Я думал, что сеанс гибернации не будет там в классе CustomerEndpoint .

Может кто-нибудь помочь мне, как этот сеанс Hibernate поддерживается загрузкой Spring?

Поскольку все думают, что это дубликат другого вопроса, но мой вопрос не является вершиной их объяснения, так как в соответствии с ними сеанс действителен до репозитория, поэтому в соответствии с этим я должен получить исключение LazyInitialization, говоря customer.getAddress внутри CustomerEndpoint, поскольку это не так. хранилище, но я не получаю никаких исключений

Всего 2 ответа


Прежде всего, не рекомендуется использовать Repository layer на вашем уровне Presentation layer .

OSIV (Open Session in View) по умолчанию включен в Spring Boot, а OSIV - плохая идея с точки зрения производительности и масштабируемости.

Из-за этого вы не получаете исключение и можете работать на уровне презентации. Проверьте, поместив следующие элементы в файл application.properties

spring.jpa.open-in-view=false

Вы можете обратиться к OSIV AntiPattern для получения более подробной информации.


Я думаю, это все еще работает, если ваш customer.getAddress находится внутри транзакции


Есть идеи?

10000