2009-11-30 8 views
12

Tôi có một ứng dụng doanh nghiệp Java cung cấp dịch vụ web, có một lớp miền và lớp kiên trì ngủ đông. Trong trường hợp đặc biệt này, không có sự khác biệt lớn (vào lúc này) giữa các đối tượng mà tôi gửi qua dây, các đối tượng miền và các đối tượng bền vững.Các lớp miền thường có chú thích JPA hoặc JAXB hay cả hai?

Hiện tại, ứng dụng sử dụng DTO ở bên liên tục và chú thích các lớp Miền có chú thích JAXB. Tuy nhiên, tôi càng đọc và suy nghĩ về nó, thì điều này càng có vẻ ngược lại! Có vẻ như hầu hết các kiến ​​trúc sư đề xuất đặt chú thích JPA vào mô hình miền và tạo DTO để gửi các đối tượng qua dây.

Trong trường hợp của tôi, tôi có thể đặt cả chú thích JAXB và JPA (Hibernate) vào các lớp miền của mình không?

Ý nghĩ giữ mặt tiền dịch vụ web, miền của tôi và sự kiên trì của tôi được kết hợp chặt chẽ với nhau có vẻ dễ bảo trì, nhưng tôi lo ngại vì chúng có thể cần thay đổi kịp thời. Nhưng nó sẽ là thông minh hơn để tạo ra một tập hợp các lớp DTO cho phía dịch vụ web và bỏ qua các DTO cho sự kiên trì?

Trả lời

11

Không có lý do chức năng nào để không chú thích cùng một lớp với cả chú thích JPA và JAXB, đôi khi tôi đã tự thực hiện. Mặc dù nó trở nên hơi khó đọc và đôi khi bạn muốn các giao dịch thiết kế lớp khác nhau với JAXB và JPA. Theo kinh nghiệm của tôi, những sự cân bằng này thường có nghĩa là bạn kết thúc với hai mô hình lớp học.

+2

Làm cho cảm giác rằng sớm hay muộn bạn sẽ cần phải tách chúng thành các lớp. Nhưng trong một dự án hoàn toàn mới, nó tiết kiệm rất nhiều thời gian để kết hợp chúng. Điều cần biết là không có tác dụng phụ xấu nào khi làm điều này. – HDave

+10

Và ở đây tôi lại 2 năm sau chia chúng ra vì webapp của khách hàng của chúng tôi chỉ muốn sử dụng dữ liệu cần thiết, do đó chúng tôi đang tạo DTO (với chú thích JAX-B) tách biệt với thực thể miền (JPA) của chúng tôi. – HDave

2

Không có vấn đề gì khi sử dụng cả chú thích trên cùng một lớp. Tôi thậm chí có xu hướng khuyến khích điều này, vì vậy bạn không phải sao chép-dán khi thay đổi xảy ra. Trong một số trường hợp, một số thuộc tính khác nhau về hành vi - ví dụ: một ID được tạo tự động có thể không được yêu cầu để được marshalled. @XmlTransient@Transient sau đó được kết hợp. Nó trở nên khó đọc, nhưng không quá khó, bởi vì rõ ràng tất cả các chú thích đều có ý nghĩa gì.

5

Tôi đồng ý rằng việc sử dụng cùng một lớp mô hình là cách tiếp cận đúng.Nếu bạn lo lắng về sự lộn xộn chú thích, bạn có thể sử dụng thực hiện JAXB (như EclipseLink JAXB) cung cấp một cơ chế cho externalizing metadata:

Cũng kể từ khi bạn đang sử dụng một mô hình JPA EclipseLink JAXB (MOXY) có phần mở rộng cho việc này dễ dàng hơn:

Dưới đây là một ví dụ của việc sử dụng một mô hình với JAXB & JPA để tạo ra một dịch vụ RESTful:

1

Bất cứ ai bị cám dỗ để đặt các đối tượng liên kết nguyên tử trong miền được duy trì của bạn bởi vì bạn đã cam kết xác định cấu trúc xml dịch vụ web của bạn ở đó? Có vẻ lạ với tôi để làm điều này. Các liên kết Hateoas có vẻ như là một ý tưởng hay nhưng miền liên tục và dịch vụ impl (không phải dịch vụ web) không quan tâm đến các liên kết nguyên tử. Sau đó, một lần nữa, bằng cách sử dụng các chú thích xml và có áo tuần tự hóa tên miền của tôi cho tôi chắc chắn là thuận tiện. Tuy nhiên, nhược điểm khác của phương pháp này là dễ dàng tác động đến người tiêu dùng dịch vụ web của bạn trong thời gian chạy với việc tái cấu trúc lớp "persistence".

+0

Tôi đồng ý rằng liên kết Atom (và chú thích JAX-B của chúng) không thuộc về một mô-đun miền. Tuy nhiên, bạn vẫn có thể đặt chú thích JAX-B vào các lớp miền mà bạn có ở đó. Điều đó nói rằng, tôi cũng sử dụng các tệp ánh xạ JAX-B XML thông qua MOXy mà tôi thấy cực kỳ thuận tiện, cộng với một cái có thể cung cấp ánh xạ khác nhau cho các điểm cuối khác nhau. – HDave

1

Tôi biết câu hỏi này hơi cũ, nhưng tôi nghĩ tôi sẽ cân nhắc vì đây là vấn đề mà tôi vừa mới gặp phải. Đề xuất của tôi sẽ chỉ để lại các lớp chú thích JAXB của bạn, vì bất kỳ thay đổi lược đồ nào sẽ yêu cầu tạo lại các lớp này. Có nghĩa là bạn sẽ phải nhập lại bất kỳ chú thích ngủ đông nào, v.v. theo cách thủ công. Đây có thể là một giải pháp hết hạn, nhưng tôi nghĩ rằng nó sẽ là hoàn toàn hợp lý để tạo ra một tệp ánh xạ ngủ đông (.hbm.xml) để định vị ánh xạ bên ngoài. Đây là một chút linh hoạt hơn, ít lộn xộn hơn, và cũng hữu ích theo ý kiến ​​của tôi.

+0

"Có nghĩa là bạn sẽ phải nhập lại bất kỳ chú thích ngủ đông nào, v.v. theo cách thủ công." - Xem Hyperjaxb3, plugin này tạo chú thích JPA một cách tự nhiên. http://confluence.highsource.org/display/HJ3/Home Tuyên bố từ chối trách nhiệm: Tôi là tác giả. – lexicore

+0

Suy nghĩ của tôi, một năm sau đó: cơ hội mà một lớp học phù hợp hoàn hảo với chú thích JPA và JAXB là khá mỏng. Tôi khuyên bạn nên chia nhỏ các tệp này thành các tệp riêng biệt 99% thời gian. –