我有一个Java企业应用程序,它提供了一个Web服务,一个域层和一个hibernate持久层.在这种特殊情况下,通过线路发送的对象,域对象和持久性对象之间(目前)没有太大差异.
目前,应用程序在持久性方面使用DTO,并使用JAXB注释注释Domain类.然而,我阅读和思考的越多,这似乎就越倒退了!(更不用说有很多代码可以支持DTO和Domain对象之间的无意识来回.)似乎大多数架构师建议在域模型上放置JPA注释并创建DTO以通过线路发送对象.
在我的情况下,我可以在我的域类中放置JAXB和JPA(Hibernate)注释吗?
保持我的Web服务外观,我的域和我的持久性都紧密捆绑在一起的想法似乎很容易维护,但确实让我担心,因为这些可能需要及时更改.但是为Web服务端创建一组DTO类并跳过持久化方面的DTO会更聪明吗?
没有使用JPA和JAXB注释来注释同一个类的功能性原因,我有时会自己完成.但是,它确实有点难以阅读,有时您需要与JAXB和JPA进行不同的类设计权衡.根据我的经验,这些权衡通常意味着你最终得到两个阶级模型.
我同意使用相同的模型类是正确的方法.如果您担心注释混乱,可以使用JAXB实现(例如EclipseLink JAXB),该实现提供外部化元数据的机制:
http://wiki.eclipse.org/EclipseLink/Examples/MOXy/EclipseLink-OXM.XML
此外,由于您使用的是JPA模型,因此EclipseLink JAXB(MOXy)具有使这更容易的扩展:
http://bdoughan.blogspot.com/2010/07/jpa-entities-to-xml-bidirectional.html
http://wiki.eclipse.org/EclipseLink/Examples/MOXy/JPA
以下是使用JAXB和JPA的一个模型创建RESTful服务的示例:
第1部分 - 数据库
第2部分 - JPA实体
第3部分 - 使用JAXB将实体映射到XML
第4部分 - RESTful服务
第5部分 - 客户