2010-06-18 29 views

Trả lời

3

Các vòng loại trong đoạn này từ Hibernate Docs ngụ ý rằng bạn có thể ghi đè lên lười biếng với háo hức, nhưng không phải là cách khác xung quanh:

Nếu bạn đang sử dụng tài sản cấp lười biếng lấy (với bytecode thiết bị đo đạc) , có thể buộc Hibernate lấy các thuộc tính lười biếng trong truy vấn đầu tiên ngay lập tức bằng cách tìm nạp tất cả các thuộc tính .

Bất thường, có vẻ như bạn có thể nếu bạn sử dụng API tiêu chí để chuyển từ mong muốn sang lười. Chỉ cần gọi số setFetchMode(FetchMode.LAZY) khi tham gia có liên quan.

+1

Dường như setFetchMode (FetchMode.LAZY) vẫn kết thúc tìm nạp chúng một cách háo hức (tức là chúng không được tìm nạp bởi một tham gia mong muốn, nhưng bằng n + 1 chọn sau truy vấn sql ban đầu). Dường như không có cách nào để ghi đè hoàn toàn cài đặt EAGER. – jsight

+0

Tôi có cùng trải nghiệm. JavaDoc cho chú thích này có vẻ như đang tranh chấp (http://opensource.atlassian.com/projects/hibernate/browse/HHH-980), nhưng việc sử dụng SELECT hoặc LAZY các con vẫn được tìm nạp. Không chắc chắn nếu tôi đang làm điều gì đó sai, hoặc nếu có một lỗi Hibernate. – atrain

+0

'FetchMode.LAZY' cũng không được chấp nhận –

4

Tôi đã có một tình huống vì lý do lịch sử đã háo hức tìm nạp giữa một vài phụ thuộc một đến nhiều. Qua nhiều năm, nhiều nơi phụ thuộc vào nó nên rất khó để tắt. Tuy nhiên đối với một số trường hợp, tìm nạp háo hức đang cản trở: đối với mọi lựa chọn lớn hơn trên bảng, nó sẽ sinh ra 100 truy vấn con nhỏ cho mỗi bộ sưu tập của từng đối tượng. Tôi tìm thấy một cách để giải quyết vấn đề này, không thực sự ghi đè quá trình tìm nạp háo hức, nhưng đối với tôi cũng hữu ích: chỉ cần tạo một truy vấn duy nhất thực hiện tất cả các tìm nạp con cùng một lúc. Điều này sẽ làm cho 1 truy vấn vật lý đến cơ sở dữ liệu, thay vì có hibernate đi bộ đồ thị phụ thuộc và đẻ trứng 100 truy vấn.

Vì vậy, tôi thay thế

Query q = session.createQuery("from Customer c"); 

bởi

Query q = session.createQuery("from Customer c " + 
           "left join fetch c.vats v " + 
           "left join fetch v.klMemos bk " + 
           "left join fetch bk.ferryKlMemos"); 

1 khách hàng có nhiều số thuế GTGT, số thuế GTGT 1 có nhiều klmemos và vân vân. Tình huống cũ trước tiên sẽ chỉ tìm nạp khách hàng và ngủ đông sau đó sẽ bắt đầu tìm nạp từng bộ sưu tập phụ thuộc. Biểu mẫu thứ hai sẽ tải mọi thứ trong một truy vấn gốc và hibernate sẽ tìm thấy tất cả những gì cần để điền các bộ sưu tập mong muốn vào bộ nhớ cache đối tượng.

Lưu ý cách tiếp cận này cũng mô phỏng tìm nạp nhanh háo hức cho các bộ sưu tập được cấu hình là lười, vì bạn đang điền tất cả các bộ sưu tập "lười" theo cách háo hức (và hiệu quả).

Các vấn đề liên quan