Notice: This Wiki is now read only and edits are no longer 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 52: | Line 52: | ||
The '''manager''' and '''reports''' elements contain the IDs of the '''Employee''' instances they are referencing. | The '''manager''' and '''reports''' elements contain the IDs of the '''Employee''' instances they are referencing. | ||
+ | |||
+ | The following example shows how to define this mapping information in EclipseLink's OXM metadata format. | ||
+ | |||
+ | <source lang="xml"> | ||
+ | ... | ||
+ | <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> | ||
+ | ... | ||
+ | </source> | ||
Because the '''@XmlIDREF''' annotation is also compatible with the '''@XmlList''' annotation, the '''Employee''' object could be modeled as: | Because the '''@XmlIDREF''' annotation is also compatible with the '''@XmlList''' annotation, the '''Employee''' object could be modeled as: |
Revision as of 12:56, 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.
The following example shows how to define this mapping information in EclipseLink's OXM metadata format.
... <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> ...
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>