Le annotazioni di Hibernate per le relazioni
In Hibernate, le relazioni tra le entita vengono esplicitate utilizzando annotazioni sulle proprietà delle classi Java che rappresentano le entita. Ci sono diverse annotazioni disponibili in Hibernate per esplicitare diversi tipi di relazioni, come uno-a-uno, uno-a-molti, molti-a-uno e molti-a-molti.
@OneToMany
Questa annotazione indica una relazione uno-a-molti tra due entita, nel seguente esempio vediamo come un dipartimento è composto da più dipendenti:
@Entity
public class Department {
@Id
private int id;
@OneToMany
private List<Employee> employees;
// altre proprietà della classe
}
@Entity
public class Employee {
@Id
private int id;
// altre proprietà della classe
}
@ManyToOne
Questa annotazione indica una relazione molti-a-uno tra due entita. Nel seguente esempio invertiamo l’importanza del contenitore (che rimane sempre dipartimento) rispetto all’esempio precedente.
@Entity
public class Employee {
@Id
private int id;
@ManyToOne
@JoinColumn(name = "DEPARTMENT_ID")
private Department department;
// altre proprietà della classe
}
@Entity
public class Department {
@Id
private int id;
// altre proprietà della classe
}
Nella riga @JoinColumn(name = “DEPARTMENT_ID”) possiamo notare che viene specificata la colonna relativa alla FOREIGN KEY necessaria per esplicitare la relazione.
@ManyToMany
Questa annotazione indica una relazione molti-a-molti tra due entita. Nel seguente esempio troviamo la relazione tra Impiegato e Progetto, un Progetto coinvolge più impiegati ed un Impiegato segue più Progetti.
@Entity
public class Employee {
@Id
private int id;
@ManyToMany
private List<Project> projects;
// altre proprietà della classe
}
@Entity
public class Project {
@Id
private int id;
@ManyToMany
private List<Employee> employees;
// altre proprietà della classe
}
Come notiamo grazie a queste annotazioni i contenitori vengono popolati automaticamente.
Come vengono recuperate le relazioni
In Hibernate, è possibile scegliere se recuperare le relazioni tra entita in modo Eager o Lazy specificando l’opzione di fetch sull’annotazione di relazione.
L’opzione di fetch Eager significa che Hibernate carica automaticamente le relazioni tra entita quando si carica l’entità padre. Questo significa che tutte le informazioni sulle relazioni sono disponibili immediatamente senza la necessità di ulteriori query al database.
L’opzione di fetch Lazy significa che Hibernate non carica automaticamente le relazioni tra entita quando si carica l’entità padre. Invece, le informazioni sulle relazioni vengono caricate solo quando vengono effettivamente utilizzate nell’applicazione. Questo può aiutare a migliorare le prestazioni dell’applicazione poiché si evita di caricare inutilmente informazioni sulle relazioni.
Ad esempio, per impostare l’opzione di fetch Eager su una relazione uno-a-uno, si può utilizzare la seguente annotazione:
@Entity
public class Employee {
@Id
private int id;
@OneToOne(fetch = FetchType.EAGER)
private Address address;
// altre proprietà della classe
}
@Entity
public class Address
@Id
private int id;
// altre proprietà della classe
}
Per impostare l’opzione di fetch Lazy, si può utilizzare la seguente annotazione:
@Entity
public class Employee {
@Id
private int id;
@OneToOne(fetch = FetchType.LAZY)
private Address address;
// altre proprietà della classe
}
@Entity
public class Address {
@Id
private int id;
// altre proprietà della classe
}