|
|
Line 1: |
Line 1: |
− | {{EclipseLink_UserGuide
| + | See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/shared_reference_relationships002.htm |
− | |info=y
| + | |
− | |toc=y
| + | |
− | |api=y
| + | |
− | |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 XmlIDREF]
| + | |
− | }}
| + | |
− | | + | |
− | =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">
| + | |
− | 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;
| + | |
− | | + | |
− | ...
| + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | 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>
| + | |
− | | + | |
− | This would produce the following XML:
| + | |
− | | + | |
− | <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>
| + | |
− | | + | |
− | 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">
| + | |
− | 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;
| + | |
− | | + | |
− | ...
| + | |
− | }
| + | |
− | </source>
| + | |
− | | + | |
− | This would produce the following XML:
| + | |
− | <source lang="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>
| + | |
− | </source>
| + | |
− | | + | |
− | | + | |
− | {{EclipseLink_MOXy
| + | |
− | |previous=[[EclipseLink/UserGuide/MOXy/Relationships/Privately Owned/One-to-Many|Mapping One-to-Many Relationships]]
| + | |
− | |next= [[EclipseLink/UserGuide/MOXy/Relationships/Shared Reference/Keys and Foreign Keys/Composite Key|Mapping Composite Key Relationships]]
| + | |
− | }}
| + | |