2010-07-17 36 views
15

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

+0

参见http://stackoverflow.com/questions/1820428/do-domain-classes-usually-get-jpa-or-jaxb- annotations-or-both/1820445 – skaffman 2010-07-18 20:11:42

回答

7

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

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

首先,杰克逊1.5进入循环引用无限递归。我认为运营商错误,而不是一个错误。杰克逊是非常棒的软件。另外,我认为即将发布的1.6版本提供了新功能来处理这个问题,每个JACKSON-235。所以这可能很快就没有意义了!

我的其他困难与面对强连接实体的序列化紧致有关。序列化我所有的实体关系是不切实际的。我会在每个请求中天真地遵循所有实体关系的完整深度来序列化一大堆不相关的信息。

我想指定我的JAXB对象的多个序列化,根据预期的用途选择一个带有适当字段和关系的序列。但是,据我所知,JAXB和杰克逊没有提供这种灵活性。它们在定义表示时提供了很大的灵活性 - 什么是暂时的,列表的外观如何,等等 - 但我不认为一个对象可能有多个表示。也许有一种巧妙的方法可以在JAXB或Jackson下定义多个表示,并在运行时切换......如果存在这样的事情,我很有兴趣去了解。也许有一个我不知道的特征,或者是一些可以在子类中使用的技巧。但我找不到它,所以最终我放弃了并与DTO一起去了。

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

+0

是的,我有一种感觉,周期性引用和深嵌套的对象将是一个问题。但是因为我从头开始设计模型,所以我有更好的机会避免它。 – 2010-07-17 14:50:48

+0

re:多重序列化。我不确定JAXB是否会有这样的功能是一个好主意。我可以很容易地看到这样的事情,导致一个完全不可理解的注释混乱。拥有多个DTO可能会更加冗长,但至少您可以随时了解发生了什么。 – 2010-07-17 14:57:01

1

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

9

这绝对可以做到。实际上,我发现保持代码在模型之间复制的前景更加棘手。

EclipseLink对于此应用程序来说是一个很好的选择,因为它包含JPA(EclipseLink是RI并从TopLink开源)和JAXB实现。

EclipeLink JAXB (MOXy)还包含了一些扩展映射JPA实体,以XML:

欲了解更多信息,请参阅:

+0

这个项目启动时,我实际上使用EclipseLink进行持久化,但是我发现它是一个完整的灾难,并切换到Hibernate。但我仍然从您的帖子中获得一些有用的信息,所以谢谢。 – 2010-07-17 14:36:44

+0

对不起,您对EclipseLink有负面经历。 EclipseLink论坛是获得http://tiny.cc/waxx8帮助的好地方。请注意,MOXy可用于映射来自任何持久性提供者的JPA实体。 – 2010-07-19 13:23:27

+1

您可以将MOXy用于XML/JSON绑定,而不是用于持久性。我做。 – HDave 2012-01-31 21:38:26