Difference between revisions of "EclipseLink/UserGuide/MOXy/Type Level/Handling Inheritance"

From Eclipsepedia

Jump to: navigation, search
m (Replacing page with 'Please see http://www.eclipse.org/eclipselink/documentation/2.4/moxy/type_level003.htm')
 
(One intermediate revision by one user not shown)
Line 1: Line 1:
{{EclipseLink_UserGuide
+
Please see http://www.eclipse.org/eclipselink/documentation/2.4/moxy/type_level003.htm
|info=y
+
|toc=y
+
|eclipselink=y
+
|eclipselinktype=MOXy
+
|api=y
+
|apis= * [http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/oxm/annotations/XmlDiscriminatorNode.html XmlDiscriminatorNode]
+
* [http://www.eclipse.org/eclipselink/api/latest/org/eclipse/persistence/oxm/annotations/XmlDiscriminatorValue.html XmlDiscriminatorValue]
+
}}
+
 
+
= Handling Inheritance  =
+
 
+
EclipseLink MOXy provides several ways to represent your inheritance hierarchy in XML.
+
 
+
<br>
+
 
+
== Using xsi:type  ==
+
 
+
By default, EclipseLink will use the '''xsi:type''' attribute to represent inheritance in XML.
+
 
+
In this example an abstract super class ('''ContactInfo''') contains all types of contact information. '''Address''' and '''PhoneNumber''' are the concrete implementations of '''ContactInfo'''.
+
 
+
<source lang="java">
+
public abstract class ContactInfo {
+
}
+
 
+
public class Address extends ContactInfo {
+
+
  private String street;
+
  ...
+
+
}
+
 
+
public class PhoneNumber extends ContactInfo {
+
 
+
  private String number;
+
  ...
+
+
}
+
</source>
+
 
+
<br> Because the '''Customer''' object can have different types of contact information, its property refers to the superclass.
+
 
+
<source lang="java">
+
@XmlRootElement
+
public class Customer {
+
+
  private ContactInfo contactInfo;
+
  ...
+
+
}
+
</source>
+
 
+
<br> Marshalling an example '''Customer''' would produce the following XML:
+
 
+
<source lang="xml">
+
<customer>
+
  <contactInfo
+
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
      xsi:type="address">
+
      <street>323 Main Street</street>
+
  </contactInfo>
+
</customer>
+
</source>
+
 
+
Note the '''xsi:type''' attribute on the '''contactInfo''' element.
+
 
+
<br>
+
 
+
== Using Substitution Groups  ==
+
 
+
Another way to model inheritance in XML is through XML Schema's ''substitution groups'' functionality. Using this approach, the element name itself determines which subclass to use.
+
 
+
Taking the same example from above, we will add '''@XmlRootElement''' annotations to each of the subclasses, which will act as the inheritance indicator.
+
 
+
<source lang="java">
+
public abstract class ContactInfo {
+
}
+
 
+
@XmlRootElement
+
public class Address extends ContactInfo {
+
+
  private String street;
+
  ...
+
+
}
+
 
+
@XmlRootElement
+
public class PhoneNumber extends ContactInfo {
+
 
+
  private String number;
+
  ...
+
+
}
+
</source>
+
 
+
<br> Using this approach, marshalling an example '''Customer''' would produce the following XML:
+
 
+
<source lang="xml">
+
<customer>
+
  <address>
+
      <street>323 Main Street</street>
+
  </address>
+
</customer>
+
</source>
+
 
+
Note that the '''Address''' object is marshalled to the '''address''' element.
+
 
+
<br>
+
 
+
== Using @XmlDiscriminatorNode / @XmlDiscriminatorValue  ==
+
 
+
You can also use the MOXY-specific '''@XmlDiscriminatorNode''' and '''@XmlDiscriminatorValue''' annotations available in EclipseLink 2.2 to represent inheritance. With this approach, you can select the attribute to represent the subtype.
+
 
+
Using the same example from above, the '''ContactInfo''' class uses the '''@XmlDiscriminatorNode''' annotation to specify the XML attribute ('''classifier''') that will hold the subclass indicator. '''Address''' and '''PhoneNumber''' are annotated with '''@XmlDiscriminatorValue''', indicating that class' indicator name ('''address-classifier''' and '''phone-number-classifier''').
+
 
+
<source lang="java">
+
@XmlDiscriminatorNode("@classifier")
+
public abstract class ContactInfo {
+
}
+
 
+
@XmlDiscriminatorValue("address-classifier")
+
public class Address extends ContactInfo {
+
+
  private String street;
+
  ...
+
+
}
+
 
+
@XmlDiscriminatorValue("phone-number-classifier")
+
public class PhoneNumber extends ContactInfo {
+
 
+
  private String number;
+
  ...
+
+
}
+
</source>
+
 
+
<br> An example '''Customer''' would then produce the following The above sample produces the following XML:
+
 
+
<source lang="xml">
+
<customer>
+
  <contactInfo classifier="address-classifier">
+
      <street>323 Main Street</street>
+
  </contactInfo>
+
</customer>
+
</source>
+
 
+
Notice that '''Address''' is marshalled to the '''contactInfo''' element. Its '''classifier''' attribute contains the discriminator node value '''address-classifier'''.
+

Latest revision as of 09:50, 8 November 2012

Please see http://www.eclipse.org/eclipselink/documentation/2.4/moxy/type_level003.htm