13

子オブジェクトと親オブジェクトの間のクラスに双方向のナビゲーションメソッドが必要です。親のleidを指定したくないので、私の場合はIDREFでは不十分です。明確にするために、そのようなxsdから:

<complexType name="A">
    <xs:sequence>
        <element name="b" type="B" minOccurs="0" maxOccurs="unbounded"></element>
    </xs:sequence>
    <attribute name="id" type="ID"></attribute>
</complexType>
<complexType name="B">
    <attribute name="id" type="ID"></attribute>
</complexType>

クラスは次のようになります。

class A {
    ...
    public List<B> getB() { ...}
    ...
   }
class B {
    ...
    public A getA() {
    ...
}

私のxmlは次のようになっている必要があります:

<a id="a1">
    <b id="b1"/>
    <b id="b2"/>
    ...
</a>

元帥を解除した後、AからBに、そしてBからAに(b.getA()を介して)ナビゲートできるようにしたいと思います!! これは非常に基本的な機能ですが、それを実現する簡単な方法が見つかりません...

何か案が ??

前もって感謝します

4

4 に答える 4

15

必要に応じてオブジェクトツリーをアンマーシャリングして設定した後、呼び出されるメソッドを作成 できます。void afterUnmarshal(Unmarshaller, Object parent)

于 2011-06-14T11:52:08.097 に答える
7

注:私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB(JSR-222)エキスパートグループのメンバーです。

Eclipse JAXB(MOXy)は、@XmlInverseReferenceこのユースケースを処理するための拡張機能を提供します。現在、XJCで生成することはできず、ドメインモデルに直接適用する必要があります。

class A {
    ...
    public List<B> getB() { ...}
    ...
   }

class B {
    ...
    @XmlInverseReference(mappedBy="b")
    public A getA() {
    ...
}

詳細については

于 2011-06-14T12:18:50.137 に答える
5

xjcを使用してxsdからドメインモデルクラスを生成している場合のmusiKkの回答に加えて。すべてのモデルクラスに親クラスへの参照を追加するには、次のことを行う必要があります。

  1. 拡張する基本クラスを作成しますUnmarshaller.Listener

    public abstract class BaseClass extends Unmarshaller.Listener {
        protected Object parent;
    
        public void afterUnmarshal(Unmarshaller unmarshaller, Object parent)     {
            this.parent = parent;
        }
    
        public Object getParent(){
            return parent;
        }
    }
    
  2. グローバルxjcバインディング構成を作成して、すべてのモデルクラスがBaseClassを拡張する必要があることをxjcに伝えます

    <jaxb:globalBindings>
        <xjc:superClass name="com.acme.BaseClass" />
    </jaxb:globalBindings>
    
于 2015-05-28T06:52:33.887 に答える
0
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">   
    <xs:complexType name="A">
    <xs:sequence>
        <xs:element name="b" type="B" minOccurs="0" maxOccurs="unbounded">
        </xs:element>
    </xs:sequence>
    <xs:attribute name="id" type="xs:ID"></xs:attribute>
</xs:complexType>
<xs:complexType name="B">
 <xs:sequence>
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1"/>
     </xs:sequence>
</xs:complexType>
 <xs:attribute name="id" type="xs:ID"></xs:attribute>
</xs:schema>

これを試して...

于 2011-06-14T11:59:46.700 に答える