2009-09-02 22 views
9

Những nơi phổ biến nhất mà bạn đã nhận được org.hibernate.LazyInitializationException trong Grails, nguyên nhân và cách bạn giải quyết nó là gì?Grails và Hibernate's Lazy Initialization Exception

Tôi nghĩ rằng một ngoại lệ này xuất hiện rất nhiều cho người mới, vì vậy nếu bạn cung cấp thêm ví dụ, nó sẽ là tuyệt vời.

Trả lời

10

Hãy lấy một ví dụ:

class Book { 
    String title 
    Author author 
} 

class Author { 
    ... 
} 

Book book = Book.get(1) 

Như chúng ta đã biết, mặc định lấy chế độ là lười biếng trong các lớp miền. Xem xét ví dụ trên, nói rằng chúng ta nhận được đối tượng cuốn sách, sau đó đối tượng Book được gắn vào đối tượng phiên làm việc ngủ đông, tức là bộ nhớ cache mức đầu tiên tự động. Và sau khi đối tượng miền được tách ra khỏi đối tượng phiên và sau đó chúng tôi cố gắng tìm nạp book.author, tại thời điểm này nó làm tăng ngoại lệ khởi tạo Lazy.

Vì vậy, giải pháp là, để có một trong hai chế độ lấy như háo hức hoặc đính kèm đối tượng cuốn sách của bạn để ngủ đông phiên sử dụng mã đưa ra dưới đây:

if(!book.isAttached()){ 
    book.attach() 
} 

Mô tả đưa ra ở trên là một trong những kịch bản. Có thể còn nhiều hơn nữa. Tôi yêu cầu người khác vui lòng chia sẻ.

+1

Điều đó làm việc cho tôi thực sự tốt, nhưng thật tẻ nhạt khi đặt nó ở mọi nơi cần thiết! – IgniteCoders

+0

@IgniteCoders Amit dường như không hoạt động trong SO. Bạn có biết nguyên nhân và đối tượng bị tách ra trong một phiên không? –

+0

@AlexanderSuraphel Tôi thực sự không biết. Tôi chỉ đặt nó khi ngoại lệ tăng lên đâu đó – IgniteCoders