JAXB / XJC父子-父-子导航

问题描述

| 我想在子对象和父对象之间的类中使用双向导航方法。 在我的情况下,IDREF是不够的,因为我不想指定父级的ID。 要清楚,从这样的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>
解组后,我希望能够通过b.getA())从A导航到Bs,从B导航到A! 这是一个非常基本的功能,但我找不到实现此目的的简单方法... 任何想法 ?? 提前致谢     

解决方法

        您可以创建方法
void afterUnmarshal(Unmarshaller,Object parent)
,然后将其解组,然后按需设置对象树。     ,        注意:我是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() {
    ...
}
了解更多信息 http://bdoughan.blogspot.com/2010/07/jpa-entities-to-xml-bidirectional.html     ,        如果要使用xjc从xsd生成域模型类,则除了musiKk答案。 要在所有模型类中添加对父类的引用,您应该: 创建扩展
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;
    }
}
告诉xjc所有模型类都应通过创建全局xjc绑定配置来扩展BaseClass
<jaxb:globalBindings>
    <xjc:superClass name=\"com.acme.BaseClass\" />
</jaxb:globalBindings>
    ,        
<?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>
尝试这个...