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.
Difference between revisions of "EclipseLink/UserGuide/MOXy/Relationships/Shared Reference/Keys and Foreign Keys/Single Key"
Line 2: | Line 2: | ||
|info=y | |info=y | ||
|api=y | |api=y | ||
− | |apis= * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/XmlID.html | + | |apis= * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/XmlID.html XmlID] |
− | * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/XmlIDREF.html | + | * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/XmlIDREF.html XmlIDREF] |
}} | }} | ||
Revision as of 11:31, 16 March 2011
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
Single Key
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 this example, each Employee has one manager but multiple reports.
@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; ... }
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:
@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>