Гибернейт при одном реквесте несколько раз вытягивает одну и туже сущность. В разных случаях по разному, один раз дважды, второй трижды. Кто может сказать с чем это связано ? И проблема ли это в принципе или возможно я не правильно понял работу гибернейта и на самом деле все правильно? Добавляю скрин, чтобы вы смогли увидеть запросы в базу в консоли.
Так же если, это действительно повторное обращения к базе, скажите, что именно нужно добавить к вопросу (дао, сервисы, модели).

Asked
Active
Viewed 155 times
0
calm27
- 2,904
1 Answers
2
Могу предположить 2 варианта:
- Возможно, у вас неправильно объявлены связи между таблицами
Placeиplace_type. Например, имеется 2 маппинга на таблицу Place:PlaceFullиPlaceShort. Оба имеют связь many-to-one на маппингPlaceTypeтаблицы place_type. ВPlaceTypeимеется обратная связь, например, наPlaceFull. Если вы осуществите выборку изPlaceShort, то Hibernate после основной сущности осуществит выборкуPlaceType. Увидев, что обратная связь изPlaceTypeведёт не на уже выбранныйPlaceShort, а наPlaceFull, Hibernate далее осуществит выборку изPlaceFull, а после неё опять изPlaceType(т.к. он замаплен и вPlaceFullтоже). Увидев, что последний выбранныйPlaceTypeссылается на уже выбранныйPlaceFull, Hibernate на этом остановится. Таким образом получится последовательная выборка:PlaceShort->PlaceType->PlaceFull->PlaceType. Тот факт, что количество запросов меняется, может говорить о том, что некоторые записи в таблице Place могут не иметь ссылок на таблицу place_type, из-за чего Hibernate останавливается сразу. - Могут быть проблемы с многопоточностью. Тут вряд ли что-то можно подсказать - смотрите и отлаживайте самостоятельно. Если выложите проект, позволяющий воспроизвести проблему, возможно кто-то возьмётся за тестирование и поиск ошибки. Если процесс вызывается из некоего
CDI-компонента уровня приложения, запускаемого при старте сервера, убедитесь в том, что обращения к БД делаются не из конструктора, а, например, из метода помеченного как@PostConstruct. Также, проблема может быть и при обращении извне к какому-либо компоненту сервера - сервер может создать и положить в пул компонентов сразу несколько экземпляров компонента ("про запас"), но на обработку запроса отдать только один из них. Если при этом компонент делает выборку из БД в конструкторе или в@PostConstruct, то обращение к БД будет выполнено независимо от того, было ли обращение к бизнес-методу компонента.
Если мои варианты не решают проблему, добавьте в вопрос исходные коды: как минимум маппинги и исходный код, осуществляющий чтение.
bobzer
- 2,247