Chính xác thì chiến lược tìm nạp của JPA kiểm soát điều gì? Tôi không thể phát hiện ra sự khác biệt nào giữa háo hức và lười biếng. Trong cả hai trường hợp, JPA / Hibernate không tự động tham gia các mối quan hệ nhiều-một.
Ví dụ: Người có một địa chỉ duy nhất. Một địa chỉ có thể thuộc về nhiều người. Các lớp thực thể được chú thích JPA trông giống như:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
Nếu tôi sử dụng truy vấn JPA:
select p from Person p where ...
JPA / Hibernate tạo một truy vấn SQL để chọn từ bảng Person, sau đó truy vấn địa chỉ riêng biệt cho từng người:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Điều này rất tệ đối với các tập kết quả lớn. Nếu có 1000 người, nó sẽ tạo ra 1001 truy vấn (1 từ Người và 1000 khác với Địa chỉ). Tôi biết điều này vì tôi đang xem nhật ký truy vấn của MySQL. Tôi hiểu rằng việc đặt kiểu tìm nạp của địa chỉ thành háo hức sẽ khiến JPA / Hibernate tự động truy vấn với một phép nối. Tuy nhiên, bất kể kiểu tìm nạp là gì, nó vẫn tạo ra các truy vấn riêng biệt cho các mối quan hệ.
Chỉ khi tôi bảo nó tham gia một cách rõ ràng thì nó mới thực sự tham gia:
select p, a from Person p left join p.address a where ...
Am i thiếu cái gì ở đây? Bây giờ tôi phải viết tay mọi truy vấn để nó kết hợp với các mối quan hệ nhiều-một. Tôi đang sử dụng triển khai JPA của Hibernate với MySQL.
Chỉnh sửa: Nó xuất hiện (xem Câu hỏi thường gặp về Hibernate ở đây và ở đây ) FetchType
không ảnh hưởng đến các truy vấn JPA. Vì vậy, trong trường hợp của tôi, tôi đã yêu cầu nó tham gia một cách rõ ràng.