2008-10-18 2 views
7

Có cách nào khác để tránh LazyInitializationExceptions trong ứng dụng web Hibernate ngoài việc sử dụng mẫu OpenSessionInView không? Có bất kỳ nhược điểm nào khi sử dụng OpenSessionInView không?Các chiến lược để tránh Hibernate LazyInitializationExceptions

+0

Hibernate 4.1.6 giải quyết vấn đề này: http://stackoverflow.com/questions/578433/how-to-solve-lazy-initialization-exception-using-jpa-and-hibernate-as-provider/11913404#11913404 – andreak

Trả lời

8

Khi làm việc trên các ứng dụng web của chúng tôi, chúng tôi thường quyết định trước các đối tượng/trường nào sẽ cần trong các trang xem và đảm bảo rằng tất cả các objec được khởi tạo đúng từ mô hình trước khi gửi đến chế độ xem.

này có thể được thực hiện trong (ít nhất) ba cách:

  1. fetching tính sử dụng chiến lược háo hức (tức là với FetchMode.JOIN, nếu bạn đang sử dụng Criteria API)
  2. tính khởi một cách rõ ràng (ví dụ với Hibernate.initialize(property))
  3. ngầm khởi tạo thuộc tính bằng cách gọi cho trình truy cập thuộc tính thích hợp

Về những nhược điểm của OpenSessionInView, bạn đã xem trang this chưa?

5

Thường là cách tốt nhất để xử lý sự cố, mà không đưa ra quyết định toàn cầu để thực hiện tìm nạp háo hức; là sử dụng từ khóa "tìm nạp" trong kết hợp với truy vấn hql.

Từ http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html

Bên cạnh đó, một "lấy" tham gia cho phép các hiệp hội hay các bộ sưu tập của các giá trị được khởi tạo cùng với các đối tượng cha mẹ của họ, sử dụng một lựa chọn duy nhất. Điều này đặc biệt hữu ích trong trường hợp của một bộ sưu tập. Nó có hiệu quả ghi đè tham gia bên ngoài và các khai báo lười biếng của tệp ánh xạ cho các liên kết và các bộ sưu tập. Xem Phần 19.1, “Chiến lược tìm nạp” để biết thêm thông tin.

từ Cát như mèo bên tham gia lấy cat.mate trái tham gia lấy cat.kittens

1

Chuyển đến JBoss Seam.

Khuôn khổ Seam được cấu trúc tốt bởi những kẻ phát triển Hibernate.

Ngay cả với phiên mở trong chế độ xem, bạn vẫn có thể gặp một số sự cố. Tùy thuộc vào mức độ phức tạp của ứng dụng web của bạn, Open Session In View không xử lý tất cả các trường hợp. Tôi cũng gặp vấn đề với việc hiển thị dữ liệu (trong giao diện người dùng) khi tìm nạp các thực thể trong một công việc thạch anh như gửi email.

Hibernate đã tìm nạp dữ liệu một cách thông minh, việc thay đổi chế độ tìm nạp sẽ dẫn đến suy giảm hiệu suất. Không chỉ vậy, nhưng bạn đang nhận được ra khỏi quy ước và sẽ muck lên dự án của bạn với các chi tiết cấu hình không liên quan.

Walter

0

Hướng dẫn Java Java chỉ ra rằng "Hạt doanh nghiệp hỗ trợ giao dịch, cơ chế quản lý truy cập đồng thời các đối tượng được chia sẻ". Vì vậy, để xử lý các vấn đề Lazy Fetch, tôi tạo một Bean Session Java không trạng thái và sau đó nhận tất cả các lớp con mà tôi cần trước khi trở về từ phương thức. Oracle cũng đã gọi nó là một mô hình J2EE lõi "Phiên façade". Những thực hành này có vẻ như thực hành ứng dụng tốt hơn nhiều so với một số các phương pháp khác được đề cập.