2011-03-03 50 views
10

Tôi đang sử dụng phiên bản 3.6.1.FinalHibernate tải lười biếng không làm việc

Tôi đã sở hữu trong entity bean của tôi sau

@JoinColumn(name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID") 
@ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY) 
private FolderTbl parent; 

Trong thử nghiệm đơn vị của tôi, Assertnull thất bại vì getParent() là không null

assertNull(folderTbl.getParent()); 

Tôi còn phải làm gì khác để dừng tải ảnh ở chế độ ngủ đông?

Trả lời

8

Thậm chí nếu bạn đặt giá trị lười thành true, giá trị gốc sẽ không được rỗng. Tải lười biếng sử dụng một đối tượng proxy và gán nó cho thuộc tính cha. Khi chúng tôi cố gắng sử dụng phụ huynh (gọi getParent()), nó sẽ tải đối tượng cha mẹ thực sự bằng cách sử dụng đối tượng proxy.

Nếu bạn không muốn tải đối tượng không định cấu hình các thuộc tính JPA cho mục đó và đặt nó làm thoáng qua.

+0

Cảm ơn bạn đã giải thích.Bây giờ tôi đã hiểu –

6

Chánh được cấu hình một cách chính xác -tải uể oải, điểm mấu chốt là bạn đang thử nghiệm nó sai.

Hibernate sẽ tải đối tượng khi bạn gọi phương thức getParent(), khi yêu cầu đối tượng thực tế đến, nó sẽ tải.

Bạn có thể kiểm tra điều này bằng cách định cấu hình show_sql thành true. nó sẽ gọi một truy vấn khi bạn gọi getParent()

0

Đối với một số trường hợp, bạn có thể không cần tải bộ sưu tập lười. Bạn có thể có một phương pháp như dưới đây để tách bộ sưu tập khỏi phiên.

public class. .... { 
..... 
    @JoinColumn(name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID") 
    @ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY) 
    private FolderTbl parent; 
    ... 
    public void detachLazyObjects() { 
    parent = null; 
    } 

Sau đó, gọi phương thức này để tách lớp khỏi vị trí bạn cần. Vui lòng sử dụng phím tắt này một cách tiết kiệm, tôi khuyên bạn nên suy nghĩ về các cách khác để làm điều đó trước khi sử dụng giải pháp này.

0

Thực ra, gọi getParent() có thể trả về một cá thể proxy cho biết bạn có một phụ huynh. Nếu bạn truy cập vào các trường khác với id, phụ huynh sẽ được tải nếu cần.

Lưu ý rằng cha mẹ có thể được tải bởi giao dịch và do đó nằm trong bộ nhớ cache cấp đầu tiên. Nếu vậy, Hibernate thường sẽ không thực hiện một truy vấn nào khác đến cơ sở dữ liệu.

Như đã nói ở trên, nếu thực thể của bạn có tham chiếu không tạm thời tới getParent gốc() sẽ luôn trả về giá trị không null, ngay cả khi chính bố mẹ chưa được tải.

0

Hibernate xử lý tìm nạp Lười biếng làm gợi ý. Dưới đây là những gì thông số kỹ thuật JPA 2.0 nói trên trang 364 Bảng 9.

(Tùy chọn) Cho dù giá trị của trường hoặc thuộc tính phải được tải nhẹ hoặc phải háo hức. Chiến lược EAGER là yêu cầu về thời gian chạy của nhà cung cấp dai dẳng rằng giá trị phải được tải xuống một cách háo hức. Chiến lược LAZY là một gợi ý cho thời gian chạy của nhà cung cấp lâu dài.

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