2011-03-03 1 views
10

Sto utilizzando la versione 3.6.1.FinalHibernate lazy loading non funziona

Ho la seguente proprietà nel mio bean entità

@JoinColumn(name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID") 
@ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY) 
private FolderTbl parent; 

Nel mio test di unità, Assertnull fallisce perché getParent() è non null

assertNull(folderTbl.getParent()); 

Cos'altro devo fare per interrompere l'ibernazione del caricamento del genitore?

risposta

8

Anche se si imposta il pigro su true, il valore genitore non sarà nullo. Il carico lento utilizza un oggetto proxy e lo assegna alla proprietà padre. Quando proviamo a usare il genitore (chiamata getParent()) caricherà l'oggetto genitore effettivo usando l'oggetto proxy.

Se non si desidera caricare l'oggetto, non configurare le proprietà JPA per l'elemento e impostarlo come transitorio.

+0

Grazie per la spiegazione.Ora capisco –

6

Parent è configurato correttamente -carico pigramente, il punto è che sono testarlo torto.

Hibernate carica l'oggetto quando si richiama il metodo getParent(), quando viene richiesta la richiesta all'oggetto effettivo che verrà caricato.

È possibile controllare questa cosa configurando show_sql su true. invocherà una query quando invochi getParent()

0

Per alcuni scenari potrebbe non essere necessario caricare la raccolta lenta. Puoi avere un metodo come sotto per staccare la collezione dalla sessione.

public class. .... { 
..... 
    @JoinColumn(name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID") 
    @ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY) 
    private FolderTbl parent; 
    ... 
    public void detachLazyObjects() { 
    parent = null; 
    } 

quindi chiamare questo metodo per staccare la classe da cui è necessario che sia nullo. Per favore usa questa scorciatoia con parsimonia, ti suggerirei di pensare ad altri modi per farlo prima di ricorrere a questa soluzione.

0

In realtà, invocare getParent() potrebbe restituire un'istanza proxy che mostra che c'è un genitore. Se si accede a campi diversi dall'ID, il genitore verrebbe caricato se necessario.

Si noti che il genitore potrebbe essere già caricato dalla transazione e quindi risiedere nella cache di primo livello. In tal caso, Hibernate normalmente non eseguirà un'altra query sul database.

Come detto prima, se la propria entità ha un riferimento non transitorio a un genitore, getParent() restituirà sempre un valore non nullo, anche se il genitore stesso non è ancora stato caricato.

0

Hibernate considera il pigro come un suggerimento. Ecco ciò che le specifiche JPA 2.0 dice a pagina 364 Tabella 9.

(opzionale) se il valore del campo o della proprietà deve essere pigramente caricato o deve essere avidamente inverosimile. La strategia EAGER è un requisito per il runtime del provider di persistenza che il valore deve essere recuperato con impazienza. La strategia LAZY è un suggerimento per il runtime del provider di persistenza.