Biorąc pod uwagę następujący model domeny, chcę załadować wszystkie Answer
s, w tym ich Value
s i ich podrzędne, i umieścić go w, AnswerDTO
aby następnie przekonwertować na JSON. Mam działające rozwiązanie, ale cierpi na problem N + 1, którego chcę się pozbyć za pomocą ad-hoc @EntityGraph
. Wszystkie powiązania są skonfigurowane LAZY
.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Używając metody ad-hoc @EntityGraph
w Repository
metodzie, mogę upewnić się, że wartości są wstępnie pobierane, aby zapobiec N + 1 w Answer->Value
powiązaniu. Chociaż mój wynik jest w porządku, jest jeszcze jeden problem N + 1, z powodu leniwego ładowania selected
skojarzenia MCValue
s.
Za pomocą tego
@EntityGraph(attributePaths = {"value.selected"})
kończy się niepowodzeniem, ponieważ selected
pole jest oczywiście tylko częścią niektórych Value
podmiotów:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
Jak mogę powiedzieć WZP, że próbuje pobrać selected
powiązanie tylko w przypadku, gdy jest to wartość MCValue
? Potrzebuję czegoś takiego optionalAttributePaths
.
selected
dla odpowiedzi, które mająMCValue
. Nie podobało mi się, że wymagałoby to dodatkowej pętli i musiałem zarządzać mapowaniem między zestawami danych. Podoba mi się twój pomysł wykorzystania w tym celu pamięci podręcznej Hibernacji. Czy potrafisz wyjaśnić, na ile bezpieczne (pod względem spójności) jest poleganie na pamięci podręcznej w celu przechowywania wyników? Czy to działa, gdy zapytania są dokonywane w transakcji? Boję się trudnych do wykrycia i sporadycznych, leniwych błędów inicjalizacji.