2010-10-05 35 views
14

Tôi đã tạo một lớp mà trong đó tôi đã đặt một số trường của nó (các thực thể khác) được tải LAZY. Bây giờ tôi cần phải sử dụng đối tượng này sau khi nó đã được tách ra khỏi phiên, vì vậy tôi rõ ràng là cần phải chắc chắn rằng tất cả các lĩnh vực mà tôi cần được dân cư trước khi tách nó ra. Tôi đã cố gắng chỉ gọi getters cho những lĩnh vực lười biếng nhưng điều đó dường như không hoạt động. Bất cứ ai cũng có một ý tưởng làm thế nào để buộc các lĩnh vực này được nạp?Hibernate tải lười biếng trong các đối tượng tách rời

+0

bạn có chắc chắn phiên của mình đang mở khi gọi getters không? –

+0

Phiên nếu chắc chắn mở khi tôi gọi getters –

Trả lời

11
Hibernate.initialize(yourObject) 

sẽ bắt buộc khởi tạo đối tượng/bộ sưu tập được truyền cho nó. Bạn cần một phiên hoạt động cho việc này.

Nếu thực thể được tách ra, bạn phải đính kèm lại đối tượng (sử dụng merge(..)) vào một phiên hoạt động và sau đó khởi tạo nó.

+0

+1 Bozho ......... –

+1

'hợp nhất' chỉ dành cho một số trường hợp rất đặc biệt. Như một quy tắc của một ngón tay cái tôi muốn recomment 'cập nhật ' – pakore

+0

@ pakore - tốt, sự khác biệt tôi nghĩ là' hợp nhất (..) 'có thể chèn một kỷ lục mới là tốt. Nhưng tôi quen với ngữ nghĩa JPA hơn, vì vậy nó có thể hơi khác một chút ở đây. – Bozho

3

Bạn có thể gắn lại nó vào phiên. Đây là cách bình thường.

session.update(yourObject); //This reattachs the object to the current session. 
yourObject.someGetter(); //This will work now. 
1

Tôi biết rằng bạn yêu cầu Hibernate nhưng EclipseLink có tính năng này để nó có thể là giá trị kiểm tra ra nếu bạn đang sử dụng JPA và không gắn với việc thực hiện nhất định. Bạn có thể gặp phải các sự cố khác khi di chuyển sang EclipseLink mặc dù ..

2
<prop key="hibernate.enable_lazy_load_no_trans">true</prop> 

Bạn có thể thêm dòng này vào tệp cấu hình của mình, nó có thể lấy các đối tượng lười của bạn ngay cả khi tách ra, nhưng nên sử dụng phiên bản 4.1.7 vì có một số vấn đề rò rỉ kết nối với phiên bản trước đó.hãy xem here

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