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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow