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.

Gestire banca dati MySQL con hibernate

Amministratore di rete e sviluppatore. Dopo anni di esperienza nel settore, ho ideato un sistema di gestione dati MYSQL in PHP senza scrivere una sola riga di codice. Scopri di più....

x