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.
Difference between revisions of "EclipseLink/UserGuide/MOXy/Relationships/Privately Owned/One-to-Many"
< EclipseLink | UserGuide | MOXy | Relationships | Privately Owned
Line 113: | Line 113: | ||
@XmlElement(name = "phone-number") | @XmlElement(name = "phone-number") | ||
@XmlElementWrapper(name="phone-numbers") | @XmlElementWrapper(name="phone-numbers") | ||
− | private PhoneNumber | + | private List<PhoneNumber> phoneNumbers; |
... | ... |
Revision as of 15:30, 26 April 2011
EclipseLink | |
Website | |
Download | |
Community | |
Mailing List • Forums • IRC • mattermost | |
Issues | |
Open • Help Wanted • Bug Day | |
Contribute | |
Browse Source |
Key API
Contents
Privately Owned One-to-Many Relationships
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>
Mapping to Elements
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 or array field, can achieve this.
package example; import javax.xml.bind.annotation.*; @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; ... }
package example; import javax.xml.bind.annotation.*; import org.eclipse.persistence.oxm.annotations.*; @XmlAccessorType(XmlAccessType.FIELD) public class PhoneNumber { @XmlAttribute 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="first-name" type="java.lang.String"/> <xml-element java-attribute="lastName" name="last-name" type="java.lang.String"/> <xml-element java-attribute="phoneNumbers" name="phone-number" type="PhoneNumber" container-type="java.util.ArrayList"/> </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> ...
Grouping Elements using the @XmlElementWrapper Annotation
To make the elements of the Collection appear inside a grouping element, you can use @XmlElementWrapper:
package example; import javax.xml.bind.annotation.*; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Customer { @XmlElement(name = "phone-number") @XmlElementWrapper(name="phone-numbers") private List<PhoneNumber> phoneNumbers; ... }
This will produce the following XML:
<customer> <first-name>Bob</first-name> <last-name>Smith</last-name> <phone-numbers> <phone-number type="Home"> <number>5559827222</number> </phone-number> <phone-number type="Work"> <number>5558872216</number> </phone-number> </phone-numbers> </customer>