To model non-privately-owned relationships, your "target" objects must have IDs (keys) defined, and your "source" object must use these IDs to map the relationship.
Relationships represented with keys use the @XmlID
and @XmlIDREF
annotations. Although the JAXB specification requires that the property marked with @XmlID
be a String, MOXy JAXB does not enforce this restriction.
In Example 7-1, each Employee has one manager but multiple reports.
Example 7-1 Using the @XmlID and @XmlIDREF Annotations
package example; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Employee { @XmlAttribute @XmlID private Integer id; @XmlAttribute private String name; @XmlIDREF private Employee manager; @XmlElement(name="report") @XmlIDREF private List<Employee> reports; ... }
The following example shows how to define this mapping information in EclipseLink's OXM metadata format.
Example 7-2 Sample XML Mapping
... <java-type name="Employee"> <java-attributes> <xml-attribute java-attribute="id" type="java.lang.Integer" xml-id="true"/> <xml-attribute java-attribute="name" type="java.lang.String"/> <xml-element java-attribute="manager" type="mypackage.Employee" xml-idref="true"/> <xml-element java-attribute="reports" type="mypackage.Employee" container-type="java.util.ArrayList" xml-idref="true"/> </java-attributes> </java-type> ...
This would produce the following XML:
<company> <employee id="1" name="Jane Doe"> <report>2</report> <report>3</report> </employee> <employee id="2" name="John Smith"> <manager>1</manager> </employee> <employee id="3" name="Anne Jones"> <manager>1</manager> </employee> </company>
The manager and reports elements contain the IDs of the Employee instances they are referencing.
Because the @XmlIDREF
annotation is also compatible with the @XmlList
annotation, the Employee object could be modeled as:
Example 7-3 Using the @XmlList Annotation
package example; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Employee { @XmlID @XmlAttribute private Integer id; @XmlAttribute private String name; @XmlIDREF private Employee manager; @XmlIDREF @XmlList private List<Employee> reports; ... }
This would produce the following XML:
<company> <employee id="1" name="Jane Doe"> <reports>2 3</reports> </employee> <employee id="2" name="John Smith"> <manager>1</manager> </employee> <employee id="3" name="Anne Jones"> <manager>1</manager> </employee> </company>