Java对象图 - >当对象关联的方向需要反转时的xml

时间:2011-01-10 11:49:34

标签: xml jpa jaxb jaxb2

我正在处理的java应用程序具有与下面类似的关系的对象。在实际应用中,两个对象都是JPA实体。


class Underlying{}

class Thing
{
  private Underlying underlying;

  public Underlying getUnderlying()
  {
    return underlying;
  }

  public void setUnderlying(final Underlying underlying)
  {
    this.underlying = underlying;
  }
}

应用程序中需要创建以下形式的xml:

<template>
     <underlying>
        <thing/>
        <thing/>
        <thing/>
     </underlying>
</template>

所以我们遇到这样一种情况,即对象图表示Thing和Underlying之间的关系,它与xml中的表达方向相反。

我希望使用JAXB来创建xml,但理想情况下我不想创建一个新的对象层次结构来反映xml中的关联。有没有办法从当前形式的实体创建所需形式的xml(通过使用xml注释或其他东西)?我没有任何使用JAXB的经验,但是从我所做的有限研究来看,似乎不可能以任何直接的方式扭转关联的方向。任何帮助/建议将不胜感激。建议的另一个选项是使用XLST将xml转换为正确的格式。我还没有对这个主题进行任何研究,但是当我有更多信息时,我会添加问题。

谢谢,

3 个答案:

答案 0 :(得分:2)

诀窍是使底层的实例知道Thing的相关实例。以下是一些你可以提出的方法。

选项#1 - 使关系双向

最简单的方法是使关系双向化。然后,您可以利用EclipseLink JAXB (MOXy)中的@XmlInverseReference扩展。注意:我是MOXy技术主管:

选项#2 - 使用XmlAdapter

你可以创建一个改编版的底层。构建改编的底层对象时,XmlAdapter可以查询Thing的实例来填充thing属性:

答案 1 :(得分:1)

在您的情况下,JAXB可能不是正确的方法。当您需要将对象模型往返于XML并返回时,JAXB是最佳选择,并且您可以使用XML或对象模型获得一定的自由度。在这种情况下,您似乎没有自由度。没有JAXB,恕我直言。

这也是一个非常微不足道的XML元素,考虑到你将在某个地方对它们进行排序。可能在昂贵的一面将整个图形分类复制到内存中?因此,您需要从Thing排序的JPA数据存储区中获取Underlying(让数据库进行排序),然后将其传输到javax.xml.stream.XMLStreamWriter以进行输出。

在输入端,使用javax.xml.stream.XMLStreamReader

答案 2 :(得分:1)

遇到类似的问题,我只是遇到了另一种可能性:

  • 将父引用属性添加到JAXB带注释的类
  • 使用@XmlTransient
  • 注释属性
  • 实施方法public void afterUnmarshal(Unmarshaller u, Object parent)
  • 实现逻辑以在此方法中设置父指针,如下所示:this.parent= (ParentType) parent;当然,您可以使用该方法中的更多内容。

该方法在解组后由JAXB调用,顾名思义。

参考文献:(相当陈旧)discussion on forums.java.netJAXB Guide

我不能使用@XmlInverseReference,因为我们使用的是与MOXy不同的JAXB实现。 当我开始欣赏@XmlAdapter时,我发现这种方法更简单,因为它不需要额外的类。

虽然这完全不符合你的问题描述,但我仍然认为这可以帮助未来的读者。