Difference between revisions of "EclipseLink/UserGuide/MOXy/Relationships/Shared Reference/Keys and Foreign Keys/Composite Key"

From Eclipsepedia

Jump to: navigation, search
m (Replacing page with 'See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/shared_reference_relationships004.htm')
 
(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
+
}}
+

Latest revision as of 10:27, 8 November 2012

See http://www.eclipse.org/eclipselink/documentation/2.4/moxy/shared_reference_relationships004.htm