2013-01-03 19 views
6

Tôi đang phát triển một ứng dụng web đơn giản hiển thị mô hình miền làm tài nguyên RESTful. Tôi đang lên kế hoạch sử dụng JPA2 (Hibernate) với hỗ trợ REST SpringMVC.Có cách nào để hiển thị các thực thể Hibernate như tài nguyên RESTful mà không có DTO không?

Trong khi sắp xếp các thực thể Hibernate thành XML/JSON, nếu thực thể được tách ra, nó sẽ ném LazyLoadingException cho các liên kết con lười. Nếu thực thể vẫn còn gắn liền với Hibernate Session nó sẽ gần như tải toàn bộ cơ sở dữ liệu.

Tôi đã thử sử dụng Dozer CustomFieldMapper để xác định xem thuộc tính là Bộ sưu tập Hibernate lười biếng không được tải sau đó trả về NULL.

Nhưng nếu chúng ta có liên kết hai hướng Hibernate háo hức tải Nhiều-to-Một bên bên và Dozer sẽ cố gắng sao chép các thuộc tính sẽ kết thúc trong vòng lặp vô hạn dẫn đến lỗi StackOverflow. Công cụ duy nhất xung quanh mà tôi biết để giải quyết vấn đề này là sử dụng DTO và chỉ sao chép các thuộc tính bắt buộc vào các POJO (DTO) sạch và marshalling sau đó vào XML/JSON. Nhưng nó là đau đớn khủng khiếp cho mô hình miền phức tạp để sao chép tài sản bằng tay.

Có cách nào khác sạch/đơn giản hơn để (un) marshall Hibernate thực thể?

Trả lời

3

Tôi đã gặp vấn đề tương tự khi chuyển qua lại Hibernate'd VO trong các ứng dụng GWT và trong một số dự án sử dụng Dozer để có hiệu quả tốt và trong các dự án khác đã sử dụng phương pháp được mô tả trong this article. trước khi marshalling.

Hy vọng rằng sẽ giúp bạn,

+0

Đã sử dụng mã được đề cập trong bài viết, hoạt động tốt. Nhưng cần thử nghiệm trên nhiều loại ánh xạ quan hệ khác nhau. Cảm ơn bạn. –

4

tôi có vẻ quá bảo thủ nhưng tôi xem xét sử dụng DTOs vẫn còn là một ý tưởng tốt.

Độ phức tạp của ánh xạ tỷ lệ thuận với độ chi tiết của API tài nguyên của bạn, nói cách khác, thô hơn phức tạp hơn.

+2

DTO vẫn hoạt động tốt, khi được sử dụng cẩn thận. Tôi có xu hướng sử dụng chúng khi tôi muốn cung cấp một mô hình phong phú hơn các thực thể cung cấp, thường gộp chung các thực thể khác nhau thành một mô hình nhỏ gọn hơn có thể dễ dàng tương tác, đặc biệt là từ lớp web. – Gimby

+2

Tôi đồng ý với Gimby. Đôi khi chúng ta cần phải có DTO để đại diện cho dữ liệu được trình bày trên giao diện người dùng có thể là tổng hợp của nhiều thực thể. –

2

Hãy loot tại lớp này: https://github.com/viniciuspires/reqlist/blob/master/src/main/java/org/reqlist/arch/HibernateAwareObjectMapper.java

Tôi đang sử dụng Jackson như một JSON serializer/deserializer, và tôi đã phải làm cho lớp này và thêm Hibernate4Module cho nó để xác minh nếu Hibernate.isInitialized và không vô tình khởi tạo thuộc tính.

Sau đó bạn chỉ cần phải cấu hình nó như ObjectMapper của bạn, và vượt qua nó đến các mảng MessageConverters, như tôi đã làm trong dòng này:

https://github.com/viniciuspires/reqlist/blob/master/src/main/resources/META-INF/org.reqlist.context.xml#L21

đó đã làm việc như một nét duyên dáng cho tôi.

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