Ho nella mia associazione un'associazione a una collezione caricata con entusiasmo (lazy = "false" fetch = "subselect"). Come posso disattivarlo a livello di programmazione con Hibernate quando eseguo una query?Come si disattiva a livello di programmazione il recupero di eager con l'ibernazione?
risposta
In realtà, dovrebbe essere il contrario. Lo si spegne nella mappatura e lo si attiva in casi d'uso specifici con un "recupero" nella query.
Questo è il modo in cui il team di Hibernate lo vede. Non c'è modo in Hibernate per creare una richiesta che specifica "no-fetch" per una proprietà ...
Ho avuto una situazione che per ragioni storiche ha fatto desiderare di recuperare tra diverse dipendenze uno-a-molti. Nel corso degli anni molti posti sono arrivati a dipendere da questo, quindi è stato difficile spegnerlo. Tuttavia, per alcuni casi, il recupero ansioso stava ostacolando: per ogni selezione più grande sulla tabella, genererebbe 100s di piccole sottoquery per ciascuna delle raccolte di ciascuno degli oggetti. Ho trovato un modo per ovviare a questo, non proprio sovrascrivendo il recupero ansioso, ma per me altrettanto utile: semplicemente creare una singola query che fa tutti i sottofinochi in una volta. Ciò comporterà 1 query fisica al database, invece di fare in modo di andare in letargo il grafico delle dipendenze e generare 100 di query.
Così ho sostituito
Query q = session.createQuery("from Customer c");
da
Query q = session.createQuery("from Customer c " +
"left join fetch c.vats v " +
"left join fetch v.klMemos bk " +
"left join fetch bk.ferryKlMemos");
1 cliente ha molte partite IVA, il numero 1 partita IVA ha molti klmemos e così via. La vecchia situazione avrebbe prima recuperato solo i clienti e l'ibernazione avrebbe quindi avviato il recupero di ciascuna delle raccolte dipendenti una per una. Il secondo modulo carica tutto in una query nativa e Hibernate troverà tutto ciò di cui ha bisogno per popolare le raccolte desiderose nella cache degli oggetti. Spero che aiuti qualcuno. Nota: Continuo a pensare che dovresti cercare di evitare fiacchi avidamente ;-)
Questo è quello che pensavo anch'io. Stavo solo tentando la fortuna se c'è un modo per farlo. Grazie –
Sei il benvenuto. C'è qualcos'altro di cui hai bisogno per considerare la tua domanda come risposta? Intendo accettare la risposta. – KLE