在一个模型中组合JAXB和JPA

我必须设计一个将通过JPA持久化的数据模型(在Java EE 6应用程序中),并且还需要通过JAXB进行序列化。 我最后一次这样做,我有一组带有JAXB注释的实体类,另一组带有JPA注释。 这意味着我必须有很多样板代码才能在两者之间进行转换。 我正在考虑将它们组合在一起,以便每个类都有两种类型的注释。 我知道这可以做到,但我的问题是,它应该是吗? 它会引起任何问题吗?

这个问题对我来说有点过于宽泛。 但我确实有使用Jackson在JAXB下使用JPA实体的特定相关经验,您可能会感兴趣。

就我而言,我有一个JPA模型,其中包含大约三十个实体和大量循环引用。 实体之间的关系图也几乎紧密相连。 换句话说,通过遵循实体关系,可以从任何其他实体导航到集合中的几乎任何实体。 就我而言,对于所描述的实体和Jackson 1.5,在我的JPA实体上覆盖JAXB注释被certificate是个坏主意。

首先,Jackson 1.5对循环引用进行了无限递归。 我认为操作员错误而不是错误。 jackson是很棒的软件。 此外,我认为即将发布的1.6版本提供了新function来处理每个JACKSON-235 。 所以这可能很快就没有意义!

我遇到的其他困难与强连接实体面临的序列化紧凑性有关。 序列化我所有的实体关系是不切实际的。 我会通过天真地跟踪所有实体关系到他们的全部深度,在每个请求中序列化一些淫秽的无关信息。

我想指定我的JAXB对象的多个序列化,根据预期用途选择具有适当字段和关系的序列。 但是,据我所知,JAXB和jackson没有提供这样的灵活性。 它们在定义表示时提供了极大的灵活性 – 什么是瞬态,列表的外观等等 – 但我不认为一个对象可能有多种表示。 也许有一种聪明的方法可以在JAXB或Jackson下定义多个表示并在运行时切换……我有兴趣了解这样的事情是否存在。 也许有一个function,我不知道,或一些可以通过子类化播放的技巧。 但是我找不到它,所以最终我放弃了和DTO一起去了。

同样,这对模型来说非常具体。 也许这些对您来说不是问题(或者您可能有解决这些问题的聪明方法!)

绝对可以做到这一点。 我实际上发现维护代码在模型之间复制的前景更有问题。

EclipseLink是这个应用程序的绝佳选择,因为它包含JPA(EclipseLink是RI和开源的TopLink),以及JAXB实现。

EclipeLink JAXB(MOXy)还包含许多用于将JPA实体映射到XML的扩展:

  • XPath基础映射
  • 映射双向关系(使用@XmlInvereseReference)
  • 处理复合关键关系
  • 处理嵌入的密钥类
  • 处理java.sql。*类型

有关更多信息,请参阅

DataNucleus允许使用JPA到RDBMS(在后台使用JDBC)和XML(在后台使用JAXB)进行持久化。 它可以将JPA注释解释为定义JAXB序列化的执行方式 – 如果您愿意,也可以添加JAXB注释