З огляду на наступну модель домену, я хочу завантажити всі Answer
s, включаючи їх Value
s та їхніх піддітей та помістити його в, AnswerDTO
а потім перетворити на JSON. У мене є робоче рішення, але воно страждає від проблеми N + 1, від якої я хочу позбутися за допомогою спеціальних дій @EntityGraph
. Усі асоціації налаштовані LAZY
.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Використання Однорангової @EntityGraph
на Repository
методі , який я можу гарантувати , що значення попередньо натягнуті запобігти N + -на Answer->Value
асоціації. Хоча мій результат прекрасний, є ще одна проблема N + 1 через ледачу завантаження selected
асоціації MCValue
s.
Використовуючи це
@EntityGraph(attributePaths = {"value.selected"})
не вдається, оскільки це selected
поле, звичайно, лише частина деяких Value
сутностей:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Як я можу сказати JPA лише спробувати отримати selected
асоціацію, якщо значення є a MCValue
? Мені потрібно щось на кшталт optionalAttributePaths
.
selected
відповідей, які мають аMCValue
. Мені не подобалось, що для цього потрібен додатковий цикл, і мені потрібно буде керувати відображенням між наборами даних. Мені подобається ваша ідея використовувати кеш-режим Hibernate для цього. Чи можете ви пояснити, наскільки безпечно (з точки зору послідовності) покладатися на кеш, щоб містити результати? Чи працює це, коли запити виконуються в транзакції? Я боюся важко помітити і спорадично помилятися в помилках ініціалізації.