2009-09-03 6 views

risposta

6

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à ...

+0

Questo è quello che pensavo anch'io. Stavo solo tentando la fortuna se c'è un modo per farlo. Grazie –

+0

Sei il benvenuto. C'è qualcos'altro di cui hai bisogno per considerare la tua domanda come risposta? Intendo accettare la risposta. – KLE

0

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 ;-)