2012-09-24 3 views
7

Credo che ci siano solo due modi per caricare gli oggetti usando Hibernate e che è un caricamento lazy e uno è un caricamento avido. Il caricamento lento ha i suoi vantaggi, non sta caricando molti oggetti ma solo quando ne hai bisogno. Ho anche imparato che se vuoi forzare a caricare tutti i bambini per un oggetto, puoi semplicemente chiamare lo parent.getChildren().size(). Quindi cerchiamo di dire che abbiamo i seguenti oggettiquando utilizzare il caricamento Lazy/caricamento Eager in sospensione?

@Entity 
public class Customer{ 
public Set<Order> order; 
} 

@Entity 
public class Order{ 
} 

Supponiamo abbiamo clienti che ha l'ordine nel nostro sistema e potrebbe essere più di uno o addirittura nullo. Quindi la mia domanda è: non è meglio usare sempre il caricamento avido in questo caso? abbiamo bisogno della dimensione o di alcune informazioni per l'ordine relativo al cliente. Qual è il vantaggio dell'utilizzo del caricamento lazy in questa situazione, ci sono dei vantaggi?

Sto cercando di capire dove usare il caricamento lazy e dove usare il caricamento ansioso, apprezzo molto la tua visione.

risposta

19

Sto cercando di capire dove utilizzare il caricamento lazy e dove usare il caricamento immediato di , apprezziamo molto la tua visione.

Ecco alcuni pensieri:

1) Se avete intenzione di utilizzare sempre qualcosa (di sicuro), è possibile caricare ansiosi di esso.
2) relativo a 1, se non si sta quasi mai andando a usare qualcosa, pigro caricarlo.
3) Il carico pigro tende ad essere più utile quando sono coinvolte collezioni di grandi dimensioni.
4) Il caricamento eccessivo delle cose riduce gli errori relativi alla sessione, al costo potenziale di un impatto sulle prestazioni.
5) Per i modelli di dati complessi e/o database di grandi dimensioni, vedrete come la vostra app esegue il caricamento e adeguare le vostre strategie.
6) È difficile farlo bene la prima volta. Fai ciò che sembra giusto e non aver paura di cambiare se necessario.
7) Per dataset di grandi dimensioni, si rischia di scrivere comunque hql/query personalizzate, in cui i mapping predefiniti possono essere sovrascritti, quindi lazy vs eager non avrà importanza.

Se si crede # 6, quindi non rimanere bloccati cercando di pianificare troppo avanti e cambiarlo se necessario.

WRT tuo esempio specifico, probabilmente scrivere un mucchio di domande di accesso ai dati (guidati da esigenze aziendali appropriati, naturalmente)

1) Una query che carica il cliente, e lascia gli ordini nel db (caricamento così pigro) che chiamerei quando ho bisogno di ottenere informazioni sui clienti
2) Una query che carica il cliente e tutte le informazioni sugli ordini, per i casi in cui ne ho bisogno.Quindi in questo caso ignorerò il mapping predefinito.

Con queste due query, nei miei livelli di servizio ho gli strumenti di cui ho bisogno per fare ciò che è corretto in base al contesto della situazione.

+0

Sono assolutamente d'accordo, scrivere due query separate sono molto meglio che utilizzare il caricamento pigro/ansioso. Grazie per chiarire. –

+0

@hvgotcodes Puoi spiegare come raggiungere il punto # 7? –

5

Questo link risponde perfettamente alla tua domanda.

LAZY carico viene utilizzato nei casi in cui la dimensione entità correlata è enorme e non è richiesto di essere prelevati ogni volta che d'altra parte

EAGER deve essere usato con l'analisi corretta in quanto carica il rapporto ogni volta che il principale entità è caricata.

Quindi, se una relazione è assolutamente necessaria per il calcolo della logica aziendale, si dovrebbe pensare di utilizzare il caricamento EAGER; Il caricamento di LAZY servirà la maggior parte dei casi e offre meno problemi di prestazioni.