3

私が取り組んでいる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>

そのため、オブジェクトグラフが、xmlでの表現方法とは逆の方向でThingとUnderlyingの関係を表現している状況があります。

JAXBを使用してxmlを作成することを期待していますが、理想的には、xml内の関連付けを反映するために新しいオブジェクト階層を作成する必要はありません。現在のフォームのエンティティから必要なフォームのxmlを作成する方法はありますか(xmlアノテーションなどを使用して)?私はJAXBを使用した経験はありませんが、私が行った限られた調査から、関連付けの方向を簡単な方法で逆にすることはできないようです。任意のヘルプ/アドバイスをいただければ幸いです。提案されているもう1つのオプションは、XLSTを使用してxmlを正しい形式に変換することです。このトピックについてはまだ調査を行っていませんが、さらに情報があれば質問に追加します。

ありがとう、

マット。

4

3 に答える 3

2

秘訣は、UnderlyingのインスタンスにThingの関連するインスタンスを認識させることです。以下は、活用できるいくつかのアプローチです。

オプション#1-関係を双方向にする

最も簡単な方法は、関係を双方向にすることです。次に、 EclipseLink JAXB(MOXy)の@XmlInverseReference拡張機能を活用できます。注:私はMOXyの技術リーダーです。

オプション#2-XmlAdapterを使用する

Underlyingの適応バージョンを作成できます。適応された基礎オブジェクトを構築するとき、XmlAdapterはThingのインスタンスにクエリを実行して、thingsプロパティにデータを入力できます。

于 2011-01-10T14:05:19.840 に答える
1

あなたの場合、JAXBは正しいアプローチではないかもしれません。JAXBは、オブジェクトモデルをXMLにラウンドトリップして戻す必要があり、XMLまたはオブジェクトモデルのいずれかである程度の余裕がある場合に最適です。この場合、緯度がないようです。JAXBはありません、私見。

どこかでソートすることを考えると、これも自明ではない数のXML要素です。おそらく、グラフ全体とソートされたコピーをメモリに保存するのはコストがかかる側ですか?Thingしたがって、(データベースにソートを行わせる)順序付けられたJPAデータストアからsをフェッチし、Underlyingこれを出力用にストリーミングする必要がありjavax.xml.stream.XMLStreamWriterます。

入力側では、を使用しjavax.xml.stream.XMLStreamReaderます。

于 2011-01-10T13:20:48.550 に答える
1

同様の問題に苦しんで、私はちょうど追加の可能性に出くわしました:

  • 親参照プロパティをJAXB注釈付きクラスに追加します
  • プロパティに@XmlTransientアノテーションを付けます
  • メソッドを実装するpublic void afterUnmarshal(Unmarshaller u, Object parent)
  • このメソッドで親ポインターを設定するロジックを次のように実装しthis.parent= (ParentType) parent;ます。もちろん、このメソッドでさらに多くのものを設定できます。

このメソッドは、名前が示すように、アンマーシャリング後にJAXBによって呼び出されます。

参考資料:(かなり古い)forums.java.netでのディスカッションJAXBガイド

MOXyとは異なるJAXB実装を使用しているため、@XmlInverseReferenceを使用できません。@XmlAdapterに感謝するようになりましたが、追加のクラスを必要としないため、このアプローチの方が簡単だと思います。

これはあなたの問題の説明と完全には一致しませんが、それでもこれは将来の読者に役立つと思います。

于 2011-02-01T10:05:51.617 に答える