Skip to main content

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.

Jump to: navigation, search

EclipseLink/UserGuide/MOXy/Relationships/Shared Reference/Keys and Foreign Keys/Single Key


Eclipselink-logo.gif
EclipseLink
Website
Download
Community
Mailing ListForumsIRCmattermost
Issues
OpenHelp WantedBug Day
Contribute
Browse Source


Using Keys and Foreign Keys

Use the @XmlID (keys) and @XmlIDREF (foreign keys)JAXB annotations when an owned object has multiple references to other objects.


Relationships represented with keys use the XmlID annotation. 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 a one manager but multiple reports.

package blog.shared;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
 
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {
 
    @XmlAttribute
    @XmlID
    private String id;
 
    @XmlAttribute
    private String name;
 
    @XmlIDREF
    private Employee manager;
 
    @XmlElement(name="report")
    @XmlIDREF
    private List<Employee> reports;
 
    public Employee() {
        reports = new ArrayList<Employee>();
    }
 
}

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 are marshalled with the ID of the employee instance they are referencing.

Because the @XmlIDREF annotation is also compatible with the @XmlList annotation, the Employee object could be modeled as:

package blog.shared;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlIDREF;
import javax.xml.bind.annotation.XmlList;
 
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {
 
    @XmlID
    @XmlAttribute
    private String id;
 
    @XmlAttribute
    private String name;
 
    @XmlIDREF
    private Employee manager;
 
    @XmlIDREF
    @XmlList
    private List<Employee> reports;
 
    public Employee() {
        reports = new ArrayList<Employee>();
    }
 
}

Which 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>

Eclipselink-logo.gif
Version: 2.2.0
Other versions...

Back to the top