我有一个Java企业应用程序,它提供了一个Web服务,一个域层和一个hibernate持久层。在这种特殊情况下,通过线路发送的对象,域对象和持久性对象之间(目前)没有太大差异。
目前,应用程序在持久性方面使用DTO,并使用JAXB注释注释Domain类。然而,我阅读和思考的越多,这似乎就越倒退! (更不用说有很多代码支持DTO和Domain对象之间的无意义来回。)似乎大多数架构师建议在域模型上放置JPA注释并创建DTO以通过线路发送对象。 / p>
在我的情况下,我可以在我的域类中放置JAXB和JPA(Hibernate)注释吗?
保持我的Web服务外观,我的域和我的持久性所有紧密捆绑在一起的想法似乎很容易维护,但确实让我担心,因为这些可能需要及时更改。但是,为Web服务端创建一组DTO类并跳过持久化方面的DTO更聪明吗?
答案 0 :(得分:11)
没有功能原因没有用JPA和JAXB注释注释同一个类,我有时自己做过。但是,它确实有点难以阅读,有时您需要与JAXB和JPA进行不同的类设计权衡。根据我的经验,这些权衡通常意味着你最终得到两个阶级模型。
答案 1 :(得分:5)
我同意使用相同的模型类是正确的方法。如果您担心注释混乱,可以使用JAXB实现(例如EclipseLink JAXB)来提供外部化元数据的机制:
此外,由于您使用的是JPA模型,因此EclipseLink JAXB(MOXy)具有扩展功能,可以使其更加轻松:
以下是使用JAXB& amp; JPA创建RESTful服务:
答案 2 :(得分:2)
在同一个类上同时使用两个注释没有问题。我甚至倾向于鼓励这样做,因为在发生变化时你不必复制粘贴。
在某些情况下,某些属性的行为会有所不同 - 例如,可能不需要对自动生成的ID进行编组。然后合并@XmlTransient
和@Transient
。它确实有点难以阅读,但并不太难,因为所有注释的含义都很明显。
答案 3 :(得分:1)
有人试图将原子链接对象放在你的持久域中,因为你已经承诺在那里定义你的web服务xml结构?这样做对我来说似乎很奇怪。 Hateoas链接似乎是一个好主意,但持久域和服务impl(不是Web服务)对原子链接没有兴趣。然后再次使用xml注释并让我的域名为我的序列化当然很方便。这种方法的另一个缺点是,在运行时使用持久性域“层”重构很容易影响您的Web服务使用者。
答案 4 :(得分:1)
我知道这个问题有点陈旧,但我认为无论如何我都会权衡,因为这是我最近遇到的一个问题。我的建议是单独保留JAXB注释类,因为任何模式更改都需要重新生成这些类。这意味着您必须手动重新输入任何休眠注释等。这可能是一个过时的解决方案,但我认为创建一个hibernate映射文件(.hbm.xml)来容纳外部映射是完全合理的。这有点灵活,不那么杂乱,在我看来同样有用。