Tôi có các thực thể JPA Đặt hàng có quan hệ ManyToOne với Khách hàng. Nó là hai chiều, để khách hàng cũng có một đơn đặt hàng trường OneToMany. Cả hai quan hệ này đều sử dụng hàm EAGER (hoặc nằm trong vùng tìm nạp OpenJPA).ngăn N + 1 chọn trong JPA
Khi tôi chọn từ Đơn đặt hàng, tôi nhận được 1 lựa chọn cho các đơn hàng và N chọn cho trường Customer.orders. Để tôi ngạc nhiên vấn đề này là hiện tại với OpenJPA, EclipseLink và Hibernate, ngay cả khi tôi sử dụng JOIN FETCH (mà không làm việc trong một trường hợp một chiều).
Có cách nào tốt để giải quyết vấn đề này không? Có giải pháp nào để giải quyết vấn đề chọn N + 1 cho các đồ thị phức tạp hơn không?
EDIT: Kết quả nghiên cứu của riêng tôi: - Đối với OpenJPA (tôi đang sử dụng) Tôi chưa biết giải pháp nào - Đối với Hibernate @Fetch (FetchMode.SUBSELECT) giải quyết vấn đề. Sử dụng @BatchSize cũng giúp, điều này chọn một số lượng nhất định của các trường customer.orders cùng một lúc. - Đối với EclipseLink tôi tìm thấy một tính năng tương tự @BatchFetch (value = BatchFetchType.IN) nhưng nó không giúp ích trong trường hợp này, tôi cho rằng nó không thể xử lý hiệu quả điều này trong một mối quan hệ hai chiều.
Đây có lẽ là một câu hỏi rambly. Bạn có * một vấn đề cụ thể * bạn muốn trợ giúp hoặc bạn chỉ muốn khiếu nại về JPA? – millimoose
Bạn nói đúng, tôi cảm thấy hơi thất vọng với JPA, tôi sẽ chỉnh sửa câu hỏi của mình để trở nên quan trọng hơn. –
Bạn có thực sự cần tìm nạp EAGER trên Customer.orders không? – Esteve