2009-09-17 61 views
9

Thực tiễn tốt nhất khi sử dụng thực thể JPA là gì?JPA POJO làm đối tượng dữ liệu

Vì thực thể JPA chỉ là POJO, được coi là thích hợp để sử dụng đối tượng làm đối tượng dữ liệu trong các phần khác của hệ thống hay tôi nên chuyển đổi chúng sang đối tượng dữ liệu khác?

Có thể chấp nhận sử dụng các POJO thực thể JPA ở các phần khác của hệ thống không liên quan đến JPA không?

Trả lời

8

Thực thể giờ đây chính họ có khả năng vận chuyển dữ liệu của riêng họ, vậy tại sao lại chuyển đổi chúng thành thứ gì đó khác? Nói cách khác, tôi có xu hướng đồng ý với DTO an AntiPattern in EJB 3.0:

Trọng lượng nặng tính chất của Entity Beans trong thông số kỹ thuật EJB trước khi EJB 3.0, dẫn đến việc sử dụng các mẫu thiết kế như Data Transfer Objects (DTO). DTO trở thành các đối tượng trọng lượng nhẹ (mà lẽ ra phải là các thực thể đậu tự ở vị trí đầu tiên), được sử dụng để gửi dữ liệu qua các tầng. [...]

Đặc tả EJB 3.0 làm cho mô hình Bean thực thể giống như đối tượng Java thuần cũ (POJO). Với mô hình POJO mới này, bạn sẽ không cần phải tạo DTO cho từng thực thể hoặc cho một tập hợp các thực thể nữa. Nếu bạn muốn gửi các thực thể EJB 3.0 trên cấp, chúng sẽ chỉ triển khai java.io.Serialiazable.

+0

Ghi nhận bạn với câu trả lời vì bạn đã liên kết với tài liệu thú vị về mô hình phản đối. – Tazzy531

3

Tùy thuộc vào ý bạn với "các phần khác". Vì các thực thể JPA của bạn phải bằng cách nào đó liên quan đến hệ thống của bạn tại sao không sử dụng chúng vì chúng đã có sẵn. Điểm quan trọng là, bạn không sử dụng cùng một lớp học cho hai mối quan tâm hoàn toàn khác nhau (đó là sau đó imho hoặc là một dấu hiệu của thiết kế xấu hoặc chỉ là một hệ thống thực sự lớn). Mọi thứ khác có thể sẽ chỉ kết thúc trong một bản đồ bất tận xung quanh giữa các rắc rối POJO khác nhau của bạn.

Ví dụ: người dùng Đăng nhập. Nó có thể là thực hành Java thông thường để tạo một UserLoginForm Bean riêng biệt cho thông tin đăng nhập dựa trên web nhưng hãy xem xét điều này:

Bạn đã có người dùng JPA (và do đó người dùng POJO) trong cơ sở dữ liệu (tên người dùng, mật khẩu băm, địa chỉ và các công cụ khác có thể được lưu trữ). Bạn có thể sử dụng chính xác cùng một đối tượng trong yêu cầu đăng nhập của bạn từ biểu mẫu web (một số Khung như Spring sẽ ánh xạ nó ngay lập tức). Tạo một đối tượng User rỗng, đặt tên người dùng và mật khẩu băm và thực hiện truy vấn JPA bằng ví dụ. Nếu truy vấn đó trả về chính xác một kết quả thì thông tin đăng nhập là hợp lệ và bạn có thể lưu trữ đối tượng người dùng đã nạp trong phiên.

6

Đây là một câu hỏi hay.

Bằng cách phơi bày các lớp thực thể JPA với phần còn lại của hệ thống, bạn phơi bày cơ chế và đối tượng bền vững với ánh xạ db. Bạn sẽ mất quyền kiểm soát đối tượng được CRUD và quản lý như thế nào. Bằng cách phá vỡ sự đóng gói bền bỉ, một sự thay đổi có thể có hiệu ứng gợn sóng trên phần còn lại của hệ thống.

Những thay đổi trong tương lai đối với sự kiên trì của hệ thống có thể là không thể, khó xử, giới hạn và/hoặc rủi ro. Ví dụ: bạn có thể cần phải tối ưu hóa cho hiệu suất và/hoặc khả năng mở rộng. Điều này có thể yêu cầu bộ nhớ đệm, thay đổi lược đồ db, sử dụng không RDBMS, nhiều cơ sở dữ liệu. Việc đóng gói cũng giúp giảm thiểu việc di chuyển sang các lược đồ db trong tương lai.

Vì vậy, thương mại giảm giá là:

  • quản lý và duy trì một lớp kiên trì ứng dụng trên đầu trang của JPA mà gói gọn bền bỉ. tức là một giao diện.HOẶC
  • quyết định sử dụng JPA trên bảng trong kiến ​​trúc của bạn. Chấp nhận thực tế là những thay đổi trong tương lai có thể có hiệu ứng hệ thống rộng.

Tùy chọn đầu tiên có thể cần thiết nếu thay đổi hệ thống thường xuyên không được chấp nhận - ví dụ: Các bên thứ ba đang truy cập dữ liệu của bạn. Hoặc có lẽ bạn đã quyết định về kiến ​​trúc 3 lớp: GUI, logic nghiệp vụ, kiên trì.

Tùy chọn thứ hai là ok nếu bạn có quy trình phát triển nhanh và có quyền kiểm soát toàn bộ hệ thống và chấp nhận thực tế là thay đổi hệ thống có thể cần thiết.

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