|
|
(7 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
− | {{EclipseLink_UserGuide
| + | See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/shared_reference_relationships004.htm |
− | |info=y
| + | |
− | |api=y
| + | |
− | |toc=y
| + | |
− | |apis= * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/XmlAccessType.html javax.xml.bind.annotation.XmlAccessType]
| + | |
− | * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/XmlCustomizer.html javax.xml.bind.annotation.XmlCustomizer]
| + | |
− | * [http://www.eclipse.org/eclipselink/api/latest/javax/xml/bind/annotation/XmlInverseReference.html javax.xml.bind.annotation.XmlInverseReference]
| + | |
− | |eclipselink=y
| + | |
− | |eclipselinktype=MOXy
| + | |
− | }}
| + | |
− | | + | |
− | =Mapping Composite Key Relationships=
| + | |
− | | + | |
− | If the objects that you want to map have multi-part keys (i.e., a combination of fields that determines uniqueness), you can use EclipseLink's '''@XmlKey''' and '''@XmlJoinNodes''' to set up this relationship.
| + | |
− | | + | |
− | One or more '''@XmlKey''' annotations can be used to declare the primary keys in a given class. For a single key, either '''@XmlID''' or '''@XmlKey''' can be used. For composite primary keys, multiple '''@XmlKey''' annotations can be used, or a single '''@XmlID''' can be combined with one or more '''@XmlKey''' annotations.
| + | |
− | | + | |
− | In this example, each '''Employee''' has one '''manager''' but multiple '''reports''', and '''Employees''' are uniquely identified by the combination of their '''id''' and '''name''' fields.
| + | |
− | | + | |
− | <source lang="java">
| + | |
− | @XmlAccessorType(XmlAccessType.FIELD)
| + | |
− | public class Employee {
| + | |
− | @XmlID
| + | |
− | @XmlAttribute
| + | |
− | private Integer id;
| + | |
− |
| + | |
− | @XmlKey
| + | |
− | @XmlAttribute
| + | |
− | private String name;
| + | |
− |
| + | |
− | @XmlJoinNodes( {
| + | |
− | @XmlJoinNode(xmlPath = "manager/@id", referencedXmlPath = "@id"),
| + | |
− | @XmlJoinNode(xmlPath = "manager/@name", referencedXmlPath = "@name") })
| + | |
− | public Employee manager;
| + | |
− | | + | |
− | @XmlJoinNodes( {
| + | |
− | @XmlJoinNode(xmlPath = "report/@id", referencedXmlPath = "@id"),
| + | |
− | @XmlJoinNode(xmlPath = "report/@name", referencedXmlPath = "@name") })
| + | |
− | public List<Employee> reports = new ArrayList<Employee>();
| + | |
− | | + | |
− | ...
| + | |
− | }
| + | |
− | </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">
| + | |
− | @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/Shared Reference/Keys and Foreign Keys/Single Key|Single Key]]
| + | |
− | |up =[[EclipseLink/UserGuide/MOXy/Relationships/Shared Reference/Keys and Foreign Keys|Keys and Foreign Keys]]
| + | |
− | |next =[[EclipseLink/UserGuide/MOXy/Relationships/Shared Reference/Keys and Foreign Keys/Embedded Key Class|Embedded Key Class]]
| + | |
− | |version=2.2.0 DRAFT
| + | |
− | }}
| + | |