我想在子对象和父对象之间的类中使用双向导航方法。 在我的情况下,IDREF是不够的,因为我不想指定父的le 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>
解组后,我希望能够将A导航到Bs并从B导航到A(通过b.getA())!! 这是一个非常基本的功能,但我找不到一种简单的方法来实现这一目标......
任何想法??
提前致谢
答案 0 :(得分:14)
您可以create a method void afterUnmarshal(Unmarshaller, Object parent)
被调用...好吧,在解组并根据需要设置对象树。
答案 1 :(得分:5)
注意:我是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() {
...
}
了解更多信息
答案 2 :(得分:4)
除了 musiKk 之外,如果您使用 xjc 从xsd生成域模型类。 要在所有模型类中添加对父类的引用,您应该:
创建扩展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>
答案 3 :(得分: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>
试试这个......