Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/UserGuide/MOXy/Relationships/Privately Owned/One-to-Many"
Line 83: | Line 83: | ||
... | ... | ||
</source> | </source> | ||
+ | |||
+ | ==Using EclipseLink's @XmlPath Annotation== | ||
+ | By default, your Java attributes will be mapped to XML based on their attributes Java name, or by a name specified in an '''@XmlElement''' annotation. This mapping is based on XPath, and EclipseLink's '''@XmlPath''' annotation allows you to customize this mapping. For example, you can use it to control the nesting of your elements in XML: | ||
+ | |||
+ | <source lang="java"> | ||
+ | @XmlRootElement | ||
+ | @XmlAccessorType(XmlAccessType.FIELD) | ||
+ | public class Customer { | ||
+ | @XmlPath("contact-info/phone-number") | ||
+ | private PhoneNumber phoneNumber; | ||
+ | |||
+ | ... | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | This will produce the following XML: | ||
+ | |||
+ | <source lang="xml"> | ||
+ | <customer> | ||
+ | <contact-info> | ||
+ | <phone-number> | ||
+ | <number>555-631-2124</number> | ||
+ | </phone-number> | ||
+ | </contact-info> | ||
+ | </customer> | ||
+ | </source> | ||
+ | |||
+ | You can also use '''@XmlPath''' to map to different occurrences of the same element in XML, by index. For example: | ||
+ | |||
+ | <source lang="java"> | ||
+ | @XmlRootElement | ||
+ | @XmlAccessorType(XmlAccessType.FIELD) | ||
+ | public class Customer { | ||
+ | @XmlPath("contact-info/phone[1]") | ||
+ | private PhoneNumber homePhone; | ||
+ | @XmlPath("contact-info/phone[2]") | ||
+ | private PhoneNumber workPhone; | ||
+ | ... | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | will produce the following XML: | ||
+ | |||
+ | <source lang="xml"> | ||
+ | <customer> | ||
+ | <contact-info> | ||
+ | <phone> | ||
+ | <number>555-631-2124</number> | ||
+ | </phone> | ||
+ | <phone> | ||
+ | <number>555-631-8298</number> | ||
+ | </phone> | ||
+ | </contact-info> | ||
+ | </customer> | ||
+ | </source> | ||
+ | |||
{{EclipseLink_MOXy | {{EclipseLink_MOXy |
Revision as of 16:12, 10 March 2011
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
One-to-Many Mapping
This section illustrates how to map one-to-many relationships with Eclipselink.
The schema below shows a typical 1:M relationship between Customer and PhoneNumber
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="customer" type="customer-type"/> <xsd:complexType name="customer-type"> <xsd:sequence> <xsd:element name="first-name" type="xsd:string"/> <xsd:element name="last-name" type="xsd:string"/> <xsd:element name="phone-number" type="phone-type" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="phone-type"> <xsd:sequence> <xsd:attribute name="type" type="xsd:string"/> <xsd:element name="number" type="xsd:int"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
The following example shows how to annotate your Java class to obtain this mapping with EclipseLink. The standard JAXB @XmlElement annotation, when used on a Collection field, can achieve this.
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Customer { @XmlElement(name="first-name") private String firstName; @XmlElement(name="last-name") private String lastName; @XmlElement(name="phone-number") private List<PhoneNumber> phoneNumbers; ... } @XmlAccessorType(XmlAccessType.FIELD) public class PhoneNumber { private String type; private Integer number; ... }
The following example shows how to define your mapping information in EclipseLink's OXM metadata format.
... <java-type name="Customer"> <xml-root-element name="customer"/> <java-attributes> <xml-element java-attribute="firstName" name="phone-number" type="java.lang.String"/> <xml-element java-attribute="lastName" name="phone-number" type="java.lang.String"/> <xml-element java-attribute="phoneNumbers" name="phone-number" type="PhoneNumber"/> </java-attributes> </java-type> <java-type name="PhoneNumber"> <java-attributes> <xml-attribute java-attribute="type" type="java.lang.String"/> <xml-value java-attribute="number" type="java.lang.Integer"/> </java-attributes> </java-type> ...
Using EclipseLink's @XmlPath Annotation
By default, your Java attributes will be mapped to XML based on their attributes Java name, or by a name specified in an @XmlElement annotation. This mapping is based on XPath, and EclipseLink's @XmlPath annotation allows you to customize this mapping. For example, you can use it to control the nesting of your elements in XML:
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Customer { @XmlPath("contact-info/phone-number") private PhoneNumber phoneNumber; ... }
This will produce the following XML:
<customer> <contact-info> <phone-number> <number>555-631-2124</number> </phone-number> </contact-info> </customer>
You can also use @XmlPath to map to different occurrences of the same element in XML, by index. For example:
@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Customer { @XmlPath("contact-info/phone[1]") private PhoneNumber homePhone; @XmlPath("contact-info/phone[2]") private PhoneNumber workPhone; ... }
will produce the following XML:
<customer> <contact-info> <phone> <number>555-631-2124</number> </phone> <phone> <number>555-631-8298</number> </phone> </contact-info> </customer>