Class XMLCompositeObjectMapping

  • All Implemented Interfaces:
    java.io.Serializable, java.lang.Cloneable, org.eclipse.persistence.internal.oxm.mappings.CompositeObjectMapping<org.eclipse.persistence.internal.sessions.AbstractSession,​AttributeAccessor,​org.eclipse.persistence.internal.queries.ContainerPolicy,​Converter,​ClassDescriptor,​org.eclipse.persistence.internal.helper.DatabaseField,​XMLMarshaller,​Session,​UnmarshalKeepAsElementPolicy,​XMLUnmarshaller,​XMLRecord>, org.eclipse.persistence.internal.oxm.mappings.Mapping<org.eclipse.persistence.internal.sessions.AbstractSession,​AttributeAccessor,​org.eclipse.persistence.internal.queries.ContainerPolicy,​ClassDescriptor,​org.eclipse.persistence.internal.helper.DatabaseField,​XMLRecord>, org.eclipse.persistence.internal.oxm.mappings.XMLConverterMapping<XMLMarshaller,​Session,​XMLUnmarshaller>, XMLMapping, XMLNillableMapping
    Direct Known Subclasses:
    XMLVariableXPathObjectMapping

    public class XMLCompositeObjectMapping
    extends AbstractCompositeObjectMapping
    implements XMLMapping, org.eclipse.persistence.internal.oxm.mappings.CompositeObjectMapping<org.eclipse.persistence.internal.sessions.AbstractSession,​AttributeAccessor,​org.eclipse.persistence.internal.queries.ContainerPolicy,​Converter,​ClassDescriptor,​org.eclipse.persistence.internal.helper.DatabaseField,​XMLMarshaller,​Session,​UnmarshalKeepAsElementPolicy,​XMLUnmarshaller,​XMLRecord>, XMLNillableMapping

    Composite object XML mappings represent a relationship between two classes. In XML, the "owned" class may be nested with the element tag representing the "owning" class. This mapping is, by definition, privately owned.

    Composite object XML mappings can be used in the following scenarios:

    • Mapping into the Parent Record
    • Mapping to an Element
    • Mapping to Different Elements by Element Name
    • Mapping to Different Elements by Element Position

    Setting the XPath: TopLink XML mappings make use of XPath statements to find the relevant data in an XML document. The XPath statement is relative to the context node specified in the descriptor. The XPath may contain path and positional information; the last node in the XPath forms the local root node for the composite object. The XPath is specified on the mapping using the setXPath method.

    The following XPath statements may be used to specify the location of XML data relating to an object's name attribute:

    XPath Description
    . Indicates "self".
    phone-number The phone-number information is stored in the phone-number element.
    contact-info/phone-number The XPath statement may be used to specify any valid path.
    phone-number[2] The XPath statement may contain positional information. In this case the phone-number information is stored in the second occurrence of the phone-number element.

    Mapping into the Parent Record: The composite object may be mapped into the parent record in a corresponding XML document.

    XML Schema
    <?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="street" type="xsd:string"/>
          <xsd:element name="city" type="xsd:string"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>

    Code Sample
    XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping();
    addressMapping.setAttributeName("address");
    addressMapping.setXPath(".");
    addressMapping.setReferenceClass(Address.class);

    Mapping to an Element: The composite object may be mapped to an element in a corresponding XML document.

    XML Schema
    <?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="address">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="street" type="xsd:string"/>
                <xsd:element name="city" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>

    Code Sample
    XMLCompositeObjectMapping addressMapping = new XMLCompositeObjectMapping();
    addressMapping.setAttributeName("address");
    addressMapping.setXPath("address");
    addressMapping.setReferenceClass(Address.class);

    More Information: For more information about using the XML Composite Object Mapping, see the "Understanding XML Mappings" chapter of the Oracle TopLink Developer's Guide.

    See Also:
    Serialized Form
    Since:
    Oracle TopLink 10g Release 2 (10.1.3)
    • Constructor Detail

      • XMLCompositeObjectMapping

        public XMLCompositeObjectMapping()
    • Method Detail

      • getContainerAccessor

        @Deprecated
        public AttributeAccessor getContainerAccessor()
        Deprecated.
        Replaced by getInverseReferenceMapping().getAttributeAccessor()
        Gets the AttributeAccessor that is used to get and set the value of the container on the target object.
      • setContainerAccessor

        @Deprecated
        public void setContainerAccessor​(AttributeAccessor anAttributeAccessor)
        Deprecated.
        Replaced by getInverseReferenceMapping().setAttributeAccessor()
        Sets the AttributeAccessor that is used to get and set the value of the container on the target object.
        Parameters:
        anAttributeAccessor - - the accessor to be used.
      • setContainerAttributeName

        @Deprecated
        public void setContainerAttributeName​(java.lang.String attributeName)
        Deprecated.
        Replaced by getInverseReferenceMapping().setAttributeName()
        Sets the name of the backpointer attribute on the target object. Used to populate the backpointer. If the specified attribute doesn't exist on the reference class of this mapping, a DescriptorException will be thrown during initialize.
        Parameters:
        attributeName - - the name of the backpointer attribute to be populated
      • getContainerAttributeName

        @Deprecated
        public java.lang.String getContainerAttributeName()
        Deprecated.
        Replaced by getInverseReferenceMapping().getAttributeName()
        Gets the name of the backpointer attribute on the target object. Used to populate the backpointer.
      • setContainerGetMethodName

        @Deprecated
        public void setContainerGetMethodName​(java.lang.String methodName)
        Deprecated.
        Replaced by getInverseReferenceMapping().setGetMethodName()
        Sets the method name to be used when accessing the value of the back pointer on the target object of this mapping. If the specified method doesn't exist on the reference class of this mapping, a DescriptorException will be thrown during initialize.
        Parameters:
        methodName - - the getter method to be used.
      • setContainerSetMethodName

        @Deprecated
        public void setContainerSetMethodName​(java.lang.String methodName)
        Deprecated.
        Replaced by getInverseReferenceMapping().setSetMethodName()
        Sets the name of the method to be used when setting the value of the back pointer on the target object of this mapping. If the specified method doesn't exist on the reference class of this mapping, a DescriptorException will be thrown during initialize.
        Parameters:
        methodName - - the setter method to be used.
      • getContainerGetMethodName

        @Deprecated
        public java.lang.String getContainerGetMethodName()
        Deprecated.
        Replaced by getInverseReferenceMapping().getGetMethodName()
        Gets the name of the method to be used when accessing the value of the back pointer on the target object of this mapping.
      • getContainerSetMethodName

        @Deprecated
        public java.lang.String getContainerSetMethodName()
        Deprecated.
        Replaced by getInverseReferenceMapping().getSetMethodName()
        Gets the name of the method to be used when setting the value of the back pointer on the target object of this mapping.
      • convertClassNamesToClasses

        public void convertClassNamesToClasses​(java.lang.ClassLoader classLoader)
        Description copied from class: AggregateMapping
        INTERNAL: Convert all the class-name-based settings in this mapping to actual class-based settings. This method is used when converting a project that has been built with class names to a project with classes.
        Specified by:
        convertClassNamesToClasses in interface org.eclipse.persistence.internal.oxm.mappings.Mapping<org.eclipse.persistence.internal.sessions.AbstractSession,​AttributeAccessor,​org.eclipse.persistence.internal.queries.ContainerPolicy,​ClassDescriptor,​org.eclipse.persistence.internal.helper.DatabaseField,​XMLRecord>
        Specified by:
        convertClassNamesToClasses in interface XMLMapping
        Overrides:
        convertClassNamesToClasses in class AggregateMapping
      • initializeReferenceDescriptorAndField

        protected void initializeReferenceDescriptorAndField​(org.eclipse.persistence.internal.sessions.AbstractSession session)
      • getXPath

        public java.lang.String getXPath()
        Get the XPath String
        Returns:
        String the XPath String associated with this Mapping
      • setXPath

        public void setXPath​(java.lang.String xpathString)
        Set the Mapping field name attribute to the given XPath String
        Specified by:
        setXPath in interface org.eclipse.persistence.internal.oxm.mappings.CompositeObjectMapping<org.eclipse.persistence.internal.sessions.AbstractSession,​AttributeAccessor,​org.eclipse.persistence.internal.queries.ContainerPolicy,​Converter,​ClassDescriptor,​org.eclipse.persistence.internal.helper.DatabaseField,​XMLMarshaller,​Session,​UnmarshalKeepAsElementPolicy,​XMLUnmarshaller,​XMLRecord>
        Parameters:
        xpathString - String
      • buildCompositeRowForDescriptor

        protected org.eclipse.persistence.internal.sessions.AbstractRecord buildCompositeRowForDescriptor​(ClassDescriptor classDesc,
                                                                                                          java.lang.Object attributeValue,
                                                                                                          org.eclipse.persistence.internal.sessions.AbstractSession session,
                                                                                                          XMLRecord parentRow,
                                                                                                          DatabaseMapping.WriteType writeType)
      • buildCompositeObject

        protected java.lang.Object buildCompositeObject​(org.eclipse.persistence.internal.descriptors.ObjectBuilder objectBuilder,
                                                        org.eclipse.persistence.internal.sessions.AbstractRecord nestedRow,
                                                        ObjectBuildingQuery query,
                                                        org.eclipse.persistence.internal.identitymaps.CacheKey parentCacheKey,
                                                        org.eclipse.persistence.internal.queries.JoinedAttributeManager joinManager,
                                                        org.eclipse.persistence.internal.sessions.AbstractSession targetSession)
        Specified by:
        buildCompositeObject in class AbstractCompositeObjectMapping
      • readFromRowIntoObject

        public java.lang.Object readFromRowIntoObject​(org.eclipse.persistence.internal.sessions.AbstractRecord databaseRow,
                                                      org.eclipse.persistence.internal.queries.JoinedAttributeManager joinManager,
                                                      java.lang.Object targetObject,
                                                      org.eclipse.persistence.internal.identitymaps.CacheKey parentCacheKey,
                                                      ObjectBuildingQuery sourceQuery,
                                                      org.eclipse.persistence.internal.sessions.AbstractSession executionSession,
                                                      boolean isTargetProtected)
                                               throws DatabaseException
        Description copied from class: DatabaseMapping
        INTERNAL: Extract value from the row and set the attribute to this value in the object. return value as this value will have been converted to the appropriate type for the object.
        Overrides:
        readFromRowIntoObject in class DatabaseMapping
        Throws:
        DatabaseException
      • valueFromRow

        public java.lang.Object valueFromRow​(java.lang.Object fieldValue,
                                             XMLRecord nestedRow,
                                             org.eclipse.persistence.internal.queries.JoinedAttributeManager joinManager,
                                             ObjectBuildingQuery sourceQuery,
                                             org.eclipse.persistence.internal.sessions.AbstractSession executionSession,
                                             boolean isTargetProtected)
                                      throws DatabaseException
        Throws:
        DatabaseException
      • valueFromRow

        public java.lang.Object valueFromRow​(org.eclipse.persistence.internal.sessions.AbstractRecord row,
                                             org.eclipse.persistence.internal.queries.JoinedAttributeManager joinManager,
                                             ObjectBuildingQuery sourceQuery,
                                             org.eclipse.persistence.internal.identitymaps.CacheKey cacheKey,
                                             org.eclipse.persistence.internal.sessions.AbstractSession executionSession,
                                             boolean isTargetProtected,
                                             java.lang.Boolean[] wasCacheUsed)
                                      throws DatabaseException
        Description copied from class: AbstractCompositeObjectMapping
        INTERNAL: Extract and return the aggregate object from the specified row.
        Overrides:
        valueFromRow in class AbstractCompositeObjectMapping
        Throws:
        DatabaseException
      • writeSingleValue

        public void writeSingleValue​(java.lang.Object value,
                                     java.lang.Object parent,
                                     XMLRecord record,
                                     org.eclipse.persistence.internal.sessions.AbstractSession session)
        Description copied from interface: XMLMapping
        INTERNAL: A method that marshals a single value to the provided Record based on this mapping's XPath. Used for Sequenced marshalling.
        Specified by:
        writeSingleValue in interface org.eclipse.persistence.internal.oxm.mappings.Mapping<org.eclipse.persistence.internal.sessions.AbstractSession,​AttributeAccessor,​org.eclipse.persistence.internal.queries.ContainerPolicy,​ClassDescriptor,​org.eclipse.persistence.internal.helper.DatabaseField,​XMLRecord>
        Specified by:
        writeSingleValue in interface XMLMapping
        Parameters:
        value - - The value to be marshalled
        record - - The Record the value is being marshalled too.
      • configureNestedRow

        public void configureNestedRow​(org.eclipse.persistence.internal.sessions.AbstractRecord parent,
                                       org.eclipse.persistence.internal.sessions.AbstractRecord child)
      • convertObjectValueToDataValue

        public java.lang.Object convertObjectValueToDataValue​(java.lang.Object value,
                                                              Session session,
                                                              XMLMarshaller marshaller)
        INTERNAL
        Specified by:
        convertObjectValueToDataValue in interface org.eclipse.persistence.internal.oxm.mappings.XMLConverterMapping<XMLMarshaller,​Session,​XMLUnmarshaller>
        Since:
        EclipseLink 2.5.0
      • convertDataValueToObjectValue

        public java.lang.Object convertDataValueToObjectValue​(java.lang.Object fieldValue,
                                                              Session session,
                                                              XMLUnmarshaller unmarshaller)
        INTERNAL
        Specified by:
        convertDataValueToObjectValue in interface org.eclipse.persistence.internal.oxm.mappings.XMLConverterMapping<XMLMarshaller,​Session,​XMLUnmarshaller>
        Since:
        EclipseLink 2.5.0