Qual è la differenza tra Eager e Lazy quando bisogna fare un caricamente di un’entità con Hibernate?
Come ben sai, Hibernate è un ORM, cioè una libreria di classi JAVA che associa i campi di un record di una tabella a degli oggetti chiamati Entità. Il sistema di associazione dei valori di questi campi agli oggetti può avvenire in due modi, EAGER e LAZY sono i due meccanismi previsti per caricare oggetti Entità.
Il tipo di caricamento, cioè EAGER e LAZY, può essere specificato su un campo di un Entità (cioè la classe che rappresenta un intero record con tutti i campi correlati) attraverso l’annotation, @basic, mentre su un campo che rappresenta una relazione attraverso le annotation di relazione e cioè: @OneToOne, @OneToMany, ManyToMany o @ManyToOne.
Quindi per realizzare il caricamento di tipo LAZY su un campo, utilizziamo l’attributo fetch
presente nell’annotation @Basic
come mostrato nell’esempio:
@Column(name="COGNOME")@Basic(fetch=FetchType.LAZY)public String getCognome(){ return cognome;}..
Ma come facciamo a sapere quando specificare LAZY e quando EAGER? beh Hibernate in assenza di una impostazione esplicita da parte del programmatore imposta per default il tipo di caricamento secondo questa tabella:
- Basic: LAZY
- OneToOne: EAGER
- ManyToOne: EAGER
- OneToMany: LAZY
- ManyToMany: LAZY
Per cui quando abbiamo dei dubbi su come impostare la tipologia di caricamento piuttosto di associare un meccanismo errato di prelevamento dei dati di un campo, possiamo lasciar decidere ad Hibernate quale usare, fidatevi è senz’altro la scelta migliore, quindi non impostate l’attributo fetch e lasciate decidere ad Hibernate, in quanto impostare un meccanismo errato di prelevamento dei dati può penalizzare pesantemente le prestazioni del software.