建议使用 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