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/Composite Key"
m |
|||
Line 9: | Line 9: | ||
}} | }} | ||
− | = | + | =Mapping Single Key Relationships= |
− | + | ||
− | + | 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'''. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <source lang="java"> | |
− | + | @XmlAccessorType(XmlAccessType.FIELD) | |
− | + | ||
− | + | ||
− | + | ||
− | @ | + | |
public class Employee { | public class Employee { | ||
+ | @XmlAttribute | ||
+ | @XmlID | ||
+ | private Integer id; | ||
+ | |||
+ | @XmlAttribute | ||
+ | private String name; | ||
+ | |||
+ | @XmlIDREF | ||
+ | private Employee manager; | ||
+ | |||
+ | @XmlElement(name="report") | ||
+ | @XmlIDREF | ||
+ | private List<Employee> reports; | ||
− | + | ... | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
} | } | ||
</source> | </source> | ||
− | + | The following example shows how to define this mapping information in EclipseLink's OXM metadata format. | |
− | <source lang=" | + | <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> | </source> | ||
− | + | This would produce the following XML: | |
− | + | ||
− | <source lang=" | + | <source lang="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> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> | ||
− | + | The '''manager''' and '''reports''' elements contain the IDs of the '''Employee''' instances they are referencing. | |
− | |||
− | |||
− | |||
− | + | == Using @XmlList == | |
− | + | Because the '''@XmlIDREF''' annotation is also compatible with the '''@XmlList''' annotation, the '''Employee''' object could be modeled as: | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
<source lang="java"> | <source lang="java"> | ||
− | @ | + | @XmlAccessorType(XmlAccessType.FIELD) |
− | + | public class Employee { | |
− | public class | + | @XmlID |
− | + | @XmlAttribute | |
− | @ | + | private Integer id; |
− | @ | + | |
− | + | @XmlAttribute | |
− | + | private String name; | |
− | + | ||
− | @ | + | @XmlIDREF |
− | private Employee | + | private Employee manager; |
+ | |||
+ | @XmlIDREF | ||
+ | @XmlList | ||
+ | private List<Employee> reports; | ||
+ | ... | ||
} | } | ||
− | </source> | + | </source> |
− | + | This would produce the following XML: | |
− | + | <source lang="xml"> | |
− | <source lang=" | + | <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> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
</source> | </source> | ||
− | |||
− | |||
{{EclipseLink_MOXy | {{EclipseLink_MOXy |
Revision as of 15:39, 16 March 2011
EclipseLink MOXy
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
Mapping Single Key Relationships
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; ... }
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> ...
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.
Using @XmlList
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>