hibernate
Hämtar i viloläge
Sök…
Introduktion
Hämta är verkligen viktigt i JPA (Java Persistence API). I JPA används HQL (Hibernate Query Language) och JPQL (Java Persistence Query Language) för att hämta enheterna baserat på deras relationer. Även om det är väldigt bättre än att använda så många anslutande frågor och subfrågor för att få vad vi vill ha genom att använda inbyggd SQL, påverkar strategin hur vi hämtar de tillhörande enheterna i JPA fortfarande väsentligt resultatet av vår applikation.
Det rekommenderas att använda FetchType.LAZY. Gå med och hämta kolumnerna när de behövs.
Nedan visas en arbetsgivarklass som mappas till tabellen arbetsgivaren. Som ni kan se använde jag fetch = FetchType.LAZY istället för fetch = FetchType.EAGER. Anledningen till att jag använder LAZY beror på att arbetsgivaren kan ha många egenskaper senare och varje gång jag kanske inte behöver känna till alla arbetsområden för en arbetsgivare, så att ladda alla av dem kommer att leda till dåliga resultat då en arbetsgivare laddas.
@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;
}
}
För LAZY hämtade föreningar leder emellertid ibland oinitialiserade proxyer till LazyInitializationException. I det här fallet kan vi helt enkelt använda JOIN FETCH i HQL / JPQL för att undvika 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