2012-06-17 9 views

risposta

5

Il carico lento si basa sul fatto che Hibernate utilizza strutture che possono essere inviate tramite proxy quando si tenta di accedere ai dati per la prima volta. Quando lo fai, queste strutture diranno di ibernare che ora hanno bisogno di caricare le informazioni e Hibernate lo farà al volo, senza che tu sappia cosa sta succedendo.

Gli array non possono essere caricati come pigri perché Hibernate non avrebbe modo di sapere che si sta tentando di accedervi per la prima volta, dal momento che non è possibile proxy l'operatore "[]" (il bytecode aaload), Hibernate non saprebbe mai quando hai tentato di accedervi per non essere in grado di caricarlo al volo.

Quando si utilizzano le raccolte, è sempre necessario accedervi tramite i loro metodi, quindi Hibernate può essere sicuro al 100% quando si tenta di accedervi per la prima volta e quindi caricarli.

Quindi, la vera ragione è che non c'è modo di collegare il codice all'operatore di accesso all'array. Lo stesso accade sul caricamento lento per i campi, Hibernate non può caricare pigro una proprietà non di raccolta con accesso solo al campo in quanto non saprebbe quando hai provato ad accedere al campo, devono sempre avere accesso al metodo get/set.

Come esempio di come questo viene fatto, è possibile controllare la collezione PersistentList su Hibernate, su esso è indexOf metodo (e molti altri) il metodo read si chiama:

public int indexOf(Object value) { 
    read(); 
    return list.indexOf(value); 
} 

E alla fine della read il metodo inizializza la raccolta solo se non è ancora stata caricata.

+0

Grazie mille per la risposta. Sembra assurdo che non sia possibile utilizzare l'array solo perché Hibernate non può agganciare l'operatore di accesso all'array. Quindi deriva fondamentalmente da una limitazione del linguaggio Java? – fabien7474

+1

Sì, ma è una limitazione importante dal punto di vista delle prestazioni, se l'accesso dell'array fosse una chiamata di metodo, sarebbero necessarie almeno due operazioni per farlo. Non ha molto senso utilizzare un array in questo caso poiché si aggiungere/rimuovere oggetti dalla raccolta di sospensione e questo non è qualcosa di semplice da fare in un array. –

Problemi correlati