Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
EclipseLink/UserGuide/MOXy/Relationships/Shared Reference/Keys and Foreign Keys/Single Key
< EclipseLink | UserGuide | MOXy | Relationships | Shared Reference | Keys and Foreign Keys
Revision as of 12:26, 14 December 2010 by Rick.sapir.oracle.com (Talk | contribs)
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
Using Keys and Foreign Keys
Use the @XmlID (keys) and @XmlIDREF (foreign keys)JAXB annotations when an owned object has multiple references to other objects.
Relationships represented with keys use the XmlID annotation. Although the JAXB specification requires that the property marked with @XmlID be a String, MOXy JAXB does not enforce this restriction.
In this example, each Employee has a one manager but multiple reports.
package blog.shared; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlID; import javax.xml.bind.annotation.XmlIDREF; @XmlAccessorType(XmlAccessType.FIELD) public class Employee { @XmlAttribute @XmlID private String id; @XmlAttribute private String name; @XmlIDREF private Employee manager; @XmlElement(name="report") @XmlIDREF private List<Employee> reports; public Employee() { reports = new ArrayList<Employee>(); } }
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 are marshalled with the ID of the employee instance they are referencing.
Because the @XmlIDREF annotation is also compatible with the @XmlList annotation, the Employee object could be modeled as:
package blog.shared; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlID; import javax.xml.bind.annotation.XmlIDREF; import javax.xml.bind.annotation.XmlList; @XmlAccessorType(XmlAccessType.FIELD) public class Employee { @XmlID @XmlAttribute private String id; @XmlAttribute private String name; @XmlIDREF private Employee manager; @XmlIDREF @XmlList private List<Employee> reports; public Employee() { reports = new ArrayList<Employee>(); } }
Which 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>