STACKJAVA

Hibernate FetchType là gì? Phân biệt FetchType Lazy với Eager

Hibernate FetchType là gì? Phân biệt FetchType Lazy với Eager.

(Xem thêm: Hướng dẫn tự học Hibernate)

(Xem thêm: Code ví dụ Hibernate FetchType = EAGER (Eager loading))

(Xem thêm: Code ví dụ Hibernate FetchType = LAZY (Lazy loading))

Hibernate FetchType là gì?

Trong Hibernate, FetchType là một thuộc tính trong các annotation @OneToOne, @OneToMany, @ManyToOne, @ManyToMany, được dùng để định nghĩa phương thức lấy các đối tượng liên quan.

Ví dụ mình có quan hệ sau:

Quan hệ giữa company và employee là một-nhiều.

Khi mapping sang class với Hibernate sẽ như sau:

@Entity
@Table(name = "company")
public class Company {

  //...

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
  private List<Employee> listEmployee = new ArrayList<>();

}

Annotation @OneToMany định nghĩa quan hệ giữa company và employee là 1-n. Trong đó có thuộc tính fetch:

* Lưu ý:

FetchType mặc định

Có sự khác nhau như trên là vì với annotation @ManyToOne, và @OneToOne thì khi select với fetchType = EAGER nó chỉ lấy ra nhiều nhất 1 đối tượng liên quan nên không ảnh hưởng gì tới performance. Còn nếu sử dụng fetchType = EAGER với @ManyToMany, @OneToMany thì có thể nó lấy ra rất nhiều đối tượng liên quan dẫn tới làm giảm hiệu năng, tốn bộ nhớ.

Ưu nhược điểm của mỗi loại FetchType

Với FetchType = LAZY(Lazy Loading):

Với FetchType = EAGER(Eager Loading):

 

Okay, Done!

References:

https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/FetchType.html