2017-03-22 30 views
6

Tôi đã tự hỏi như thế nào bất thường này cần được xử lý:giao dịch Boundary và DTO chuyển đổi với JPA

  1. DTO cần được chuyển đổi trong bộ điều khiển, lớp dịch vụ không cần phải biết về chúng.
  2. Ranh giới giao dịch được xác định bởi lớp dịch vụ.

Nhưng làm cách nào để tránh trường hợp ngoại lệ LazyPitialization JPA? Chuyển đổi DTO có thể cần dữ liệu Đã tải xuống Lười biếng nhưng không thể làm giao dịch được lớp dịch vụ xử lý.

Có nhiều cách tôi có thể nghĩ, nhưng tất cả đều xấu xí. Đặt chuyển đổi DTO trong lớp dịch vụ có vẻ tốt nhất với tôi ngay bây giờ.

Trả lời

5

Có, chắc chắn sẽ tốt hơn khi thao tác DTO trong lớp dịch vụ. Điều này đặc biệt đúng khi cập nhật các thực thể có thay đổi chứa trong DTO, nếu không bạn sẽ cần nhận và cập nhật các thực thể tách ra, chuyển chúng sang dịch vụ, hợp nhất chúng lại thành ngữ cảnh bền vững, v.v.

"DTO nên được chuyển đổi trong bộ điều khiển, lớp dịch vụ không cần biết về chúng. "

Thay vì điều này, tôi sẽ nói quy tắc tốt hơn là các bộ điều khiển không cần biết về các thực thể. Nhưng bạn có thể sử dụng các thực thể tách rời thay vì DTO cho các trường hợp đơn giản để tránh tạo nhiều lớp DTO nhỏ, mặc dù cá nhân tôi luôn sử dụng DTO để nhất quán và thực hiện các thay đổi sau này dễ dàng hơn.

2

Tăng 'LazyInitializationException' chỉ là tín hiệu cho thấy một số phần dữ liệu không được tải, vì vậy giải pháp tốt nhất là thực hiện nhiều cuộc gọi từ phương thức điều khiển đến cấp dịch vụ và tìm nạp tất cả các trường bắt buộc cho DTO.

tùy chọn Ít thanh lịch là:

  1. của nó có thể phát hiện các lĩnh vực mà không được nạp thông qua 'org.hibernate.Hibernate.isInitialized' phương pháp và bỏ qua chúng trong DTO xây dựng, xem mẫu ở đây đầy đủ: How to test whether lazy loaded JPA collection is initialized?

  2. Bạn có thể đánh dấu phương thức điều khiển là giao dịch, sẽ có phiên mở cửa ngủ đông sau khi gọi đến cấp dịch vụ và do đó tải chậm sẽ hoạt động.

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