将 JAXB 和 JPA 组合到一个模型中

2022-09-03 01:53:06

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


答案 1

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

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

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

有关详细信息,请参阅:


答案 2

这个问题有点太宽泛了,我无法回答。但是我确实有特定的相关经验,在JAXB下使用Jackson和JPA实体,您可能会发现很有趣。

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

首先,Jackson 1.5在循环引用上进入了无限递归。我认为这是运算符错误而不是错误。杰克逊是很棒的软件。此外,我认为即将发布的1.6版本提供了新功能来处理每个JACKSON-235。所以这可能很快就会没有实际意义!

我的另一个困难与面对强连接实体时的序列化紧凑性有关。序列化我的所有实体关系是不切实际的。我会在每个请求中序列化大量不相关的信息,通过天真地将所有实体关系完全跟踪到其深度。

我想为我的 JAXB 对象指定多个序列化,并根据预期用途选择一个具有适当字段和关系的序列化。但是,据我所知,JAXB和Jackson没有提供这样的灵活性。它们在定义表示形式方面提供了极大的灵活性 - 什么是瞬态的,列表的外观等 - 但我不认为一个对象可以有多个表示。也许有一种聪明的方法可以在JAXB或Jackson下定义多个表示,并在运行时切换...我很想知道这样的事情是否存在。也许有一个我不知道的功能,或者一些可以用子类化来玩的诡计。但我找不到它,所以最终我放弃了,选择了DTO。

同样,这都是特定于模型的。也许这些对你来说不是问题(或者也许你有聪明的解决方案来解决这些问题!


推荐