域类通常会获得JPA或JAXB注释吗?

HDa*_*ave 12 dns annotations jpa jaxb

我有一个Java企业应用程序,它提供了一个Web服务,一个域层和一个hibernate持久层.在这种特殊情况下,通过线路发送的对象,域对象和持久性对象之间(目前)没有太大差异.

目前,应用程序在持久性方面使用DTO,并使用JAXB注释注释Domain类.然而,我阅读和思考的越多,这似乎就越倒退了!(更不用说有很多代码可以支持DTO和Domain对象之间的无意识来回.)似乎大多数架构师建议在域模型上放置JPA注释并创建DTO以通过线路发送对象.

在我的情况下,我可以在我的域类中放置JAXB和JPA(Hibernate)注释吗?

保持我的Web服务外观,我的域和我的持久性都紧密捆绑在一起的想法似乎很容易维护,但确实让我担心,因为这些可能需要及时更改.但是为Web服务端创建一组DTO类并跳过持久化方面的DTO会更聪明吗?

ska*_*man 11

没有使用JPA和JAXB注释来注释同一个类的功能性原因,我有时会自己完成.但是,它确实有点难以阅读,有时您需要与JAXB和JPA进行不同的类设计权衡.根据我的经验,这些权衡通常意味着你最终得到两个阶级模型.

  • 在这里,我再次将它们分开,因为我们的客户端webapp只想消耗它所需的数据,因此我们正在制作与我们的域(JPA)实体分开的DTO(使用JAX-B注释). (10认同)
  • 从某种意义上讲,你需要将它们分成几层.但在一个全新的项目中,它可以节省大量时间来组合它们.很高兴知道这样做没有不良副作用. (2认同)

bdo*_*han 5

我同意使用相同的模型类是正确的方法.如果您担心注释混乱,可以使用JAXB实现(例如EclipseLink JAXB),该实现提供外部化元数据的机制:

此外,由于您使用的是JPA模型,因此EclipseLink JAXB(MOXy)具有使这更容易的扩展:

以下是使用JAXB和JPA的一个模型创建RESTful服务的示例: