При розробці додатків, особливо з використанням ORM (Object-Relational Mapping) інструментів, таких як Hibernate, часто виникає необхідність у взаємодії зі спільними таблицями. У даному випадку ми маємо справу з проблемою отримання даних зі спільної таблиці в Hibernate.
Зазначена проблема виникла при спробі отримати дані зі спільної таблиці, що відповідає за зв’язок багато-до-багатьох між сутностями Service і ServiceProvider. Сутність Service є власником зв’язку, тоді як ServiceProvider є не власником. При отриманні кожної сутності окремо, дані відображаються коректно, але дані зі спільної таблиці не отримуються.
У методі пошуку по ідентифікатору Service було використано метод findByIdWithProviders
для пошуку об’єкта Service за його ідентифікатором разом із даними зі спільної таблиці:
1 2 3 4 5 6 |
public Service findByID(long id){ Optional<Service> service = serviceRepository.findByIdWithProviders(id); service.ifPresent(s -> s.getServiceProviders().size()); System.out.println(service); return service.orElse(null); } |
Проте, навіть після перевірки і впевненості у правильності структури спільної таблиці, дані з неї не вдається отримати. При запиті за адресою http://localhost:8080/getService/1
, де 1 – ідентифікатор послуги, отримуємо наступну відповідь:
1 2 3 4 5 |
{ "id": 1, "serviceDescription": "Default service description1", "serviceProviders": [] } |
Замість очікуваної відповіді:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "id": 1, "serviceDescription": "Default service description1", "serviceProviders": [ { "id": 1, "providerName": "provider1", "services": [] }, { "id": 2, "providerName": "provider2", "services": [] }, { "id": 3, "providerName": "provider3", "services": [] } ] } |
Навіть при створенні нового об’єкта Service та пов’язуванні його із існуючим об’єктом ServiceProvider, повний об’єкт Service повертається, але при спробі отримати об’єкт Service самостійно, дані про ServiceProvider відсутні, і відповідь містить порожній масив.
Під час відлагодження було отримано такі SQL-запити:
1 2 3 |
Hibernate: select s1_0.service_id,s1_0.service_description,sp1_0.service_id,sp1_1.service_provider_id,sp1_1.provider_name from service s1_0 left join service_providers sp1_0 on s1_0.service_id=sp1_0.service_id left join service_provider sp1_1 on sp1_1.service_provider_id=sp1_0.service_provider_id where s1_0.service_id=? Hibernate: select s1_0.service_provider_id,s1_1.service_id,s1_1.service_description from service_providers s1_0 join service s1_1 on s1_1.service_id=s1_0.service_id where s1_0.service_provider_id=? ... |
Вище наведений код та SQL-запити здаються правильними, тому проблема може бути у іншому місці.
Будь-які поради або вказівки з приводу вирішення цієї проблеми будуть вельми цінними.