建議使用 FetchType.LAZY。在需要時加入獲取列

下面是 Employer 實體類,它對映到表僱主。如你所見,我使用了 fetch = FetchType.LAZY 而不是 fetch = FetchType.EAGER。我使用 LAZY 的原因是因為僱主可能會在以後擁有很多屬性,並且每次我可能不需要知道僱主的所有領域,因此載入所有這些屬性將導致糟糕的表現然後僱主被載入。

@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;  
        }  
    }  

但是,對於 LAZY 獲取的關聯,未初始化的代理有時會導致 LazyInitializationException。在這種情況下,我們可以簡單地在 HQL / JPQL 中使用 JOIN FETCH 來避免 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