代码之家  ›  专栏  ›  技术社区  ›  Mike Baranczak

在一个模型中结合JAXB和JPA

  •  15
  • Mike Baranczak  · 技术社区  · 14 年前

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

    3 回复  |  直到 14 年前
        1
  •  7
  •   Dan LaRocque    14 年前

    这个问题太宽泛了,我回答不了。但我确实有使用 Jackson 在JAXB下,您可能会发现有意思的JPA实体。

    在我的例子中,我有一个JPA模型,包含大约36个实体和大量循环引用。实体之间的关系图也几乎是紧密相连的。换句话说,通过遵循实体关系,可以从任何其他实体导航到集合中的几乎任何实体。在我的例子中,使用所描述的实体和Jackson1.5,在我的JPA实体上覆盖JAXB注释是一个坏主意。

    首先,Jackson1.5对循环引用进行了无限递归。我认为那个操作错误而不是错误。杰克逊是个很棒的软件。另外,我认为即将发布的1.6版本提供了根据 JACKSON-235 . 所以这可能不会很快!

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

    我想指定我的JAXB对象的多个序列化,根据预期用途选择一个具有适当字段和关系的对象。但据我所知,JAXB和杰克逊并没有提供这种灵活性。它们在定义 这个 表示——什么是暂时的,列表的外观等等——但我认为一个对象不可能有多个表示。也许有一种聪明的方法可以在JAXB或Jackson下定义多个表示,并在运行时切换…如果真有这样的东西,我会很感兴趣的。也许有一个我不知道的特性,或者一些可以用子类化来处理的技巧。但我找不到它,所以我最终放弃了DTO。

    同样,这都是模型的特有特性。也许这些对你来说是没有问题的(或者你对这些问题有聪明的解决办法!)

        2
  •  9
  •   bdoughan    14 年前

    这绝对可以做到。实际上,我发现在模型之间维护复制代码的可能性更大。

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

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

    有关详细信息,请参阅:

        3
  •  1
  •   DataNucleus    14 年前

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