Du kan kun bruge en EntityGraph
hvis associationsattributten er en del af superklassen og dermed også en del af alle underklasser. Ellers EntityGraph
vil altid mislykkes med Exception
som du i øjeblikket får.
Den bedste måde at undgå dit N+1-valgsproblem på er at opdele din forespørgsel i 2 forespørgsler:
Den 1. forespørgsel henter MCValue
enheder ved hjælp af en EntityGraph
for at hente tilknytningen kortlagt af den selected
attribut. Efter den forespørgsel gemmes disse entiteter i Hibernates cache på 1. niveau / persistenskonteksten. Hibernate vil bruge dem, når det behandler resultatet af den 2. forespørgsel.
@Query("SELECT m FROM MCValue m") // add WHERE clause as needed ...
@EntityGraph(attributePaths = {"selected"})
public List<MCValue> findAll();
Den 2. forespørgsel henter derefter Answer
enhed og bruger en EntityGraph
for også at hente den tilknyttede Value
enheder. For hver Value
enhed, vil Hibernate instansiere den specifikke underklasse og kontrollere, om cachen på 1. niveau allerede indeholder et objekt for denne klasse og primær nøglekombination. Hvis det er tilfældet, bruger Hibernate objektet fra cachen på 1. niveau i stedet for de data, der returneres af forespørgslen.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Fordi vi allerede har hentet alle MCValue
enheder med den tilhørende selected
enheder, får vi nu Answer
enheder med en initialiseret value
forening. Og hvis tilknytningen indeholder en MCValue
enhed, dens selected
tilknytning vil også blive initialiseret.