i would like to have bidirectional navigation methods in classes between child object and parent object. IDREF is not enough in my case because I don't want to specify le id of parent. to be clear, from an xsd like that:
<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>
i would like classes looks like this:
class A {
...
public List<B> getB() { ...}
...
}
class B {
...
public A getA() {
...
}
and my xml must looks like this:
<a id="a1">
<b id="b1"/>
<b id="b2"/>
...
</a>
After unmarshal, I would like to be able to navigate A to Bs AND from B to A (via b.getA()) !! It a very basic feature, but I don't find a simple way to achieve that ...
Any idea ??
Thanks in advance
Note: I'm the EclipseLink JAXB (MOXy) lead, and a member of the JAXB (JSR-222) expert group.
Eclipse JAXB (MOXy) offers the @XmlInverseReference
extension to handle this use case. Currently it can not be generated by XJC and must be applied to the domain model directly:
class A {
...
public List<B> getB() { ...}
...
}
class B {
...
@XmlInverseReference(mappedBy="b")
public A getA() {
...
}
For More Information
In addition to musiKk answer in case you are using xjc to generate domain model classes from xsd. To add reference to parent class in all model classes you should:
Create base class which extends 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;
}
}
Tell xjc that all model classes should extend your BaseClass by creating global xjc binding configuration
<jaxb:globalBindings>
<xjc:superClass name="com.acme.BaseClass" />
</jaxb:globalBindings>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With