域类通常获得JPA或JAXB注释还是两者都获得?

域类通常获得JPA或JAXB注释还是两者都获得?,jpa,annotations,dns,jaxb,Jpa,Annotations,Dns,Jaxb,我有一个Java企业应用程序,它提供了一个web服务、一个域层和一个hibernate持久层。在这种特殊情况下,我通过网络发送的对象、域对象和持久性对象之间(目前)没有很大的区别 目前,应用程序在持久性方面使用DTO,并使用JAXB注释对域类进行注释。然而,我读得越多,想得越多,这似乎越是倒退!(更不用说有很多代码支持DTO和域对象之间无意识的来回转换。)似乎大多数架构师都建议在域模型上添加JPA注释,并创建DTO以通过网络发送对象 在我的例子中,我可以在我的域类上同时添加JAXB和JPA(Hi

我有一个Java企业应用程序,它提供了一个web服务、一个域层和一个hibernate持久层。在这种特殊情况下,我通过网络发送的对象、域对象和持久性对象之间(目前)没有很大的区别

目前,应用程序在持久性方面使用DTO,并使用JAXB注释对域类进行注释。然而,我读得越多,想得越多,这似乎越是倒退!(更不用说有很多代码支持DTO和域对象之间无意识的来回转换。)似乎大多数架构师都建议在域模型上添加JPA注释,并创建DTO以通过网络发送对象

在我的例子中,我可以在我的域类上同时添加JAXB和JPA(Hibernate)注释吗


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

没有功能上的理由不使用JPA和JAXB注释来注释同一个类,我有时自己也这样做过。不过,这确实有点难以理解,有时您需要在JAXB和JPA之间进行不同的类设计权衡。根据我的经验,这些权衡通常意味着您最终会得到两个类模型。

在同一个类上使用两个注释没有问题。我甚至倾向于鼓励这样做,因为这样,当发生更改时,您不必复制粘贴。
在某些情况下,某些属性的行为不同-例如,可能不需要封送自动生成的ID<然后将code>@xmltransive和
@Transient
组合在一起。读起来确实有点难,但也不太难,因为所有注释的含义显而易见。

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

此外,由于您使用的是JPA模型EclipseLink JAXB(MOXy),因此它有一些扩展,可以简化这一过程:

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


有人试图将atom链接对象放在持久化域中,因为您已承诺在其中定义web服务xml结构?我觉得这样做很奇怪。Hateoas链接似乎是个好主意,但是持久化域和服务impl(不是web服务)对atom链接没有兴趣。再说一次,使用xml注释并让jersey序列化我的域对我来说当然很方便。不过,这种方法的另一个缺点是,持久性域“层”重构很容易在运行时影响您的web服务消费者。

我知道这个问题有点老了,但我想我还是要权衡一下,因为这是我最近遇到的一个问题。我的建议是不要使用JAXB注释类,因为任何模式更改都需要重新生成这些类。这意味着您必须手动重新输入任何hibernate注释等。这可能是一个有点过时的解决方案,但我认为创建一个hibernate映射文件(.hbm.xml)以在外部容纳映射是完全合理的。这是一个更灵活、更少混乱的方法,在我看来同样有用。

有道理,迟早你会需要将它们分成不同的层。但是在一个全新的项目中,将它们结合起来可以节省很多时间。很高兴知道这样做没有什么不良副作用。两年后,我再次将它们分开,因为我们的客户端webapp只想使用它所需的数据,因此我们正在制作与我们的域(JPA)实体分离的DTO(带有JAX-B注释)。我同意Atom link(及其JAX-B注释)不属于域模块。然而,将JAX-B注释放在已有的域类上仍然是有意义的。也就是说,我还通过MOXy使用XML JAX-B映射文件,我发现这非常方便,而且可以为不同的端点提供不同的映射。“这意味着您必须手动重新输入任何hibernate注释等。”-请参阅Hyperjaxb3,此插件自动创建JPA注释。免责声明:我是作者。一年后我的想法是:类与JPA和JAXB注释完美匹配的可能性非常小。我建议99%的时间将这些文件分解成单独的文件。