hibernate
Ottimizzazione delle prestazioni
Ricerca…
Non utilizzare il tipo di recupero EAGER
Hibernate può usare due tipi di fetch quando si sta mappando la relazione tra due entità: EAGER
e LAZY
.
In generale, il tipo di recupero EAGER
non è una buona idea, perché dice a JPA di recuperare sempre i dati, anche quando questi dati non sono necessari.
Ad esempio, se si dispone di un'entità Person
e della relazione con Address
come questa:
@Entity
public class Person {
@OneToMany(mappedBy="address", fetch=FetchType.EAGER)
private List<Address> addresses;
}
Ogni volta che interroghi una Person
, verrà restituito anche l'elenco di Address
di questa Person
.
Quindi, invece di mappare la tua entità con:
@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)
Uso:
@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)
Un'altra cosa a cui prestare attenzione è la relazione @OneToOne
e @ManyToOne
. Entrambi sono EAGER di default . Quindi, se sei preoccupato delle prestazioni della tua applicazione, devi impostare il recupero per questo tipo di relazione:
@ManyToOne(fetch=FetchType.LAZY)
E:
@OneToOne(fetch=FetchType.LAZY)
Usa la composizione invece dell'ereditarietà
Hibernate ha alcune strategie di ereditarietà. Il tipo di ereditarietà JOINED
esegue un JOIN tra l'entità child e l'entità parent.
Il problema con questo approccio è che Hibernate porta sempre i dati di tutte le tabelle coinvolte nell'eredità.
Ad esempio, se le entità Bicycle
e MountainBike
utilizzano il tipo di ereditarietà JOINED
:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {
}
E:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {
}
Qualsiasi query JPQL che colpisca MountainBike
porterà i dati della Bicycle
, creando una query SQL come:
select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...
Se hai un altro genitore per Bicycle
(come Transport
, per esempio), questa query sopra porta i dati anche da questo genitore, facendo un JOIN extra.
Come puoi vedere, anche questa è una sorta di mappatura EAGER
. Non hai la possibilità di portare solo i dati della tabella MountainBike
usando questa strategia di ereditarietà.
Il meglio per le prestazioni è utilizzare la composizione anziché l'ereditarietà.
Per fare ciò, puoi mappare l'entità MountainBike
per avere una bicycle
campo:
@Entity
public class MountainBike {
@OneToOne(fetchType = FetchType.LAZY)
private Bicycle bicycle;
}
E Bicycle
:
@Entity
public class Bicycle {
}
Ogni query ora porterà solo i dati MountainBike
per impostazione predefinita.