hibernate
Recupero in ibernazione
Ricerca…
introduzione
Il recupero è molto importante in JPA (Java Persistence API). In JPA, HQL (Hibernate Query Language) e JPQL (Java Persistence Query Language) vengono utilizzati per recuperare le entità in base alle loro relazioni. Anche se è molto meglio che utilizzare così tante query e sottocomponenti per ottenere ciò che vogliamo usando l'SQL nativo, la strategia con cui recuperiamo le entità associate in JPA sta comunque essenzialmente influenzando le prestazioni della nostra applicazione.
Si consiglia di utilizzare FetchType.LAZY. Unisciti a recuperare le colonne quando sono necessarie.
Di seguito è riportata una classe di entità Employer che viene associata al datore di lavoro della tabella. Come puoi vedere ho usato fetch = FetchType.LAZY invece di fetch = FetchType.EAGER. La ragione per cui sto usando LAZY è perché il datore di lavoro può avere molte proprietà in seguito e ogni volta che potrei non aver bisogno di conoscere tutti i campi di un datore di lavoro, così caricandoli tutti porterà a una cattiva prestazione allora un datore di lavoro è caricato.
@Entity
@Table(name = "employer")
public class Employer
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String Name;
@OneToMany(mappedBy = "employer", fetch = FetchType.LAZY,
cascade = { CascadeType.ALL }, orphanRemoval = true)
private List<Employee> employees;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Tuttavia, per le associazioni recuperate LAZY, i proxy non inizializzati a volte portano a LazyInitializationException. In questo caso, possiamo semplicemente utilizzare JOIN FETCH in HQL / JPQL per evitare LazyInitializationException.
SELECT Employer employer FROM Employer
LEFT JOIN FETCH employer.name
LEFT JOIN FETCH employer.employee employee
LEFT JOIN FETCH employee.name
LEFT JOIN FETCH employer.address