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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow