<?xml version="1.0"?>
<!--
******************************************************************************
 Copyright (c) 1998, 2010 Oracle. All rights reserved.
 This program and the accompanying materials are made available under the 
 terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 which accompanies this distribution. 
 The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 and the Eclipse Distribution License is available at 
 http://www.eclipse.org/org/documents/edl-v10.php.

 Contributors:
     Oracle - initial API and implementation from Oracle TopLink
*****************************************************************************/
-->
<!-- Oracle TopLink Object Persistence Mapping meta-data XML schema (Oracle Corporation) -->
<xsd:schema targetNamespace="http://xmlns.oracle.com/ias/xsds/toplink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:opm="http://xmlns.oracle.com/ias/xsds/opm" xmlns:toplink="http://xmlns.oracle.com/ias/xsds/toplink" elementFormDefault="qualified" attributeFormDefault="unqualified" version="10.1.3">
    <xsd:import namespace="http://xmlns.oracle.com/ias/xsds/opm" schemaLocation="object-persistence_1_0.xsd"/>
    <xsd:element name="object-persistence" type="toplink:object-persistence"/>
    <xsd:complexType name="object-persistence">
        <xsd:annotation>
            <xsd:documentation>An object-persistence mapping module, a set of class-mapping-descriptors.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:object-persistence">
                <xsd:sequence>
                    <xsd:element name="login" type="toplink:datasource-login" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The datasource connection and configuration information.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
                <xsd:attribute name="version" type="xsd:string" default="10.1.3"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="datasource-login">
        <xsd:annotation>
            <xsd:documentation>The datasource connection and configuration information.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="platform-class" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The fully qualified name of the platform class.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="user-name" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The datasource user-name.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="password" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The datasource password, this is stored in encrypted form.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="external-connection-pooling" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines if the connections are managed by the datasource driver, and a new connection should be acquire per call.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="external-transaction-controller" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines if the transaction are managed by a transaction manager, and should not be managed by TopLink.</xsd:documentation>
                    <xsd:documentation>This can also be used if the datasource does not support transactions.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="sequencing" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Sequencing information.</xsd:documentation>
                </xsd:annotation>
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="default-sequence" type="toplink:sequence" minOccurs="0">
                            <xsd:annotation>
                                <xsd:documentation>Default sequence. The name is optional. If no name provided an empty string will be used as a name.</xsd:documentation>
                            </xsd:annotation>
                        </xsd:element>
                        <xsd:element name="sequences" minOccurs="0">
                            <xsd:annotation>
                                <xsd:documentation>Non default sequences. Make sure each sequence has unique name.</xsd:documentation>
                            </xsd:annotation>
                            <xsd:complexType>
                                <xsd:sequence>
                                    <xsd:element name="sequence" type="toplink:sequence" minOccurs="0" maxOccurs="unbounded"/>
                                </xsd:sequence>
                            </xsd:complexType>
                        </xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="database-login">
        <xsd:annotation>
            <xsd:documentation>The JDBC driver and database connection and configuration information.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:datasource-login">
                <xsd:sequence>
                    <xsd:element name="driver-class" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The fully qualified name of the JDBC driver class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="connection-url" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The full JDBC driver connection URL.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="bind-all-parameters" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure if parameter binding should be used.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="cache-all-statements" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure if statement caching should be used.  This should be used with parameter binding, this cannot be used with external connection pooling.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="byte-array-binding" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure if byte array data-types should use binding.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="string-binding" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure if string data-types should use binding.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="string-binding-size" type="xsd:integer" default="256" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure the threshold string size for usage of string binding.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="streams-for-binding" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure if large byte array and string data-types should be bound as streams.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="force-field-names-to-upper-case" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure to force all field names to upper-case.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="optimize-data-conversion" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure data optimization.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="trim-strings" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure if string trailing blanks should be trimmed.  This is normally required for CHAR data-types.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="batch-writing" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Configure if batch writing should be used.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="jdbc-batch-writing" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>If using batch writing, configure if the JDBC drivers batch writing should be used.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-login">
        <xsd:annotation>
            <xsd:documentation>The JCA driver and EIS connection and configuration information.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:datasource-login">
                <xsd:sequence>
                    <xsd:element name="connection-spec-class" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The fully qualified name of the TopLink platform specific connection spec class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="connection-factory-url" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The JNDI url for the managed JCA adapter's connection factory.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="sdk-login">
        <xsd:annotation>
            <xsd:documentation>The connection and configuration information.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:datasource-login">
                <xsd:sequence>
                    <xsd:element name="accessor-class" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The fully qualified name of the SDK accessor subclass.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-login">
        <xsd:annotation>
            <xsd:documentation>The connection and configuration information.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:datasource-login" />
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="class-mapping-descriptor">
        <xsd:annotation>
            <xsd:documentation>Information of how a class is persisted to its data-store.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:class-mapping-descriptor">
                <xsd:sequence>
                    <xsd:element name="descriptor-type" type="toplink:class-descriptor-type" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the descriptor type, such as aggregate or independent.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="interfaces" type="toplink:interface-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the interfaces that this class implements..</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="locking" type="toplink:locking-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the locking behavior for the class.  Such as an optimistic locking policy based on version, timestamp or change set of columns.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="sequencing" type="toplink:sequencing-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines how a generated unique id should be assigned to the class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="caching" type="toplink:caching-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines how the class' instances should be cached.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="remote-caching" type="toplink:caching-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines how the class' instances should be cached on remote clients.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="history-policy" type="toplink:history-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines how past versions of objects are persisted to the data-store.  By default there will be no history policy.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="returning-policy" type="toplink:returning-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines retuning policy.  By default there will be no returning policy.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="amendment" type="toplink:amendment" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow for the descriptor to be amended or customized through a class API after loading.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="instantiation" type="toplink:instantiation-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow the object instantiation behavoir to be customized</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="copying" type="toplink:copy-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow the object cloning/copying behavoir to be customized.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="query-keys" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A list of query keys or aliases for database information.  These can be used in queries instead of the database column names.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="query-key" type="toplink:query-key" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Defines an alias for querying database information.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="cmp-policy" type="toplink:cmp-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Place holder of CMP information specific.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="fetch-groups" type="toplink:fetch-groups" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Contains all pre-defined fetch groups at the descriptor level</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="change-policy" type="toplink:change-policy" minOccurs="0" maxOccurs="1">
                        <xsd:annotation>
                            <xsd:documentation>Contains the Change Policy for this descriptor</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
            </xsd:sequence>
                <xsd:attribute name="schema-major-version" type="xsd:integer" fixed="10"/>
                <xsd:attribute name="schema-minor-version" type="xsd:integer" fixed="0"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="class-descriptor-type">
        <xsd:annotation>
            <xsd:documentation>Defines the class descriptor type.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="independent"/>
            <xsd:enumeration value="aggregate"/>
            <xsd:enumeration value="aggregate-collection"/>
            <xsd:enumeration value="composite"/>
            <xsd:enumeration value="composite"/>
            <xsd:enumeration value="interface"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="interface-policy">
        <xsd:annotation>
            <xsd:documentation>Specify the interfaces that a class descriptor implements, or the implemention class for an interface descriptor.</xsd:documentation>
            <xsd:documentation>Optionally a set of public interfaces for the class can be specified.  This allows the interface to be used to refer to the implementation class.</xsd:documentation>
            <xsd:documentation>If two classes implement the same interface, an interface descriptor should be defined for the interface.</xsd:documentation>
            <xsd:documentation>This can also be used to define inheritance between interface descriptors.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="interface" type="xsd:string" minOccurs="0" maxOccurs="unbounded">
                <xsd:annotation>
                    <xsd:documentation>The fully qualified interface class name.</xsd:documentation>
                    <xsd:documentation>Example: <class>example.employee.api.Employee</class>
                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="implementor-descriptor" type="xsd:string" minOccurs="0" maxOccurs="unbounded">
                <xsd:annotation>
                    <xsd:documentation>The fully qualified class name of the implementation class for which this interface is the public interface.</xsd:documentation>
                    <xsd:documentation>This can be used if the interface has only a single implementor.</xsd:documentation>
                    <xsd:documentation>Example: <class>example.employee.impl.Employee</class>
                    </xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="copy-policy">
        <xsd:annotation>
            <xsd:documentation>Allow the object cloning/copying behavoir to be customized.</xsd:documentation>
        </xsd:annotation>
    </xsd:complexType>
    <xsd:complexType name="instantiation-copy-policy">
        <xsd:annotation>
            <xsd:documentation>Creates a copying through creating a new instance to copy into.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:copy-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="clone-copy-policy">
        <xsd:annotation>
            <xsd:documentation>Allow the object cloning/copying behavoir to be customized through a clone method.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:copy-policy">
                <xsd:sequence>
                    <xsd:element name="method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name of the clone method on the object, i.e. 'clone'</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="instantiation-policy">
        <xsd:annotation>
            <xsd:documentation>Allow the object instantiation behavoir to be customized.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="method" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The name of the method on the factory to instantiate the object instance.'</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="factory-class" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The fully qualified factory class name.'</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="factory-method" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The name of the method to instantiate the factory class.'</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="amendment">
        <xsd:annotation>
            <xsd:documentation>Specifies a class and static method to be called to allow for the descriptor to be amended or customized through a class API after loading.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="amendment-class" type="xsd:string">
                <xsd:annotation>
                    <xsd:documentation> The fully qualified name of the amendment class.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="amendment-method" type="xsd:string">
                <xsd:annotation>
                    <xsd:documentation>The name of the static amendment method on the class.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="relational-class-mapping-descriptor">
        <xsd:annotation>
            <xsd:documentation>Defines a class mapping to a relational database table(s).</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:class-mapping-descriptor">
                <xsd:sequence>
                    <xsd:element name="tables" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of the tables the class is persisted to.  Typically a class is persisted to a single table, but multiple tables can be defined.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="table" type="opm:table" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>The list of tables that the class is persisted to.  This is typically a single table but can be multiple, or empty for inheritance or aggregated classes.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="multiple-table-primary-keys" type="opm:foreign-key" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow the foreign key field references to be define for multiple table descriptors.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="multiple-table-foreign-keys" type="opm:foreign-key" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow the foreign key field references to be define for multiple table descriptors.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="multiple-table-join-criteria" type="opm:criteria" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For complex multiple table join conditions an expression may be provided instead of the table foreign key information.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="locking-policy">
        <xsd:annotation>
            <xsd:documentation>Defines an optimistic locking policy.</xsd:documentation>
        </xsd:annotation>
    </xsd:complexType>
    <xsd:complexType name="version-locking-policy">
        <xsd:annotation>
            <xsd:documentation>Defines an optimistic locking policy based on a numeric version field/column that tracks changes and the version to an object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:locking-policy">
                <xsd:sequence>
                    <xsd:element name="version-field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The name and optionally the table of the column that the attribute is stored into.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="store-version-in-cache" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the version value should be stored in the cache, or if it will be stored in the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="timestamp-locking-policy">
        <xsd:annotation>
            <xsd:documentation>Defines an optimistic locking policy based on timestamp version column that tracks changes and the version to an object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:version-locking-policy">
                <xsd:sequence>
                    <xsd:element name="server-time" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the timestamp should be obtained locally or from the database server.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="all-fields-locking-policy">
        <xsd:annotation>
            <xsd:documentation>Defines an optimistic locking policy based on comparing the original read values of all fields of the object with the current state of the values in the database.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:locking-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="changed-fields-locking-policy">
        <xsd:annotation>
            <xsd:documentation>Defines an optimistic locking policy based on comparing the original read values of only the changed fields of the object with the current state of the values in the database.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:locking-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="selected-fields-locking-policy">
        <xsd:annotation>
            <xsd:documentation>Defines an optimistic locking policy based on comparing the original read values of a specified set of fields of the object with the current state of the values in the database.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:locking-policy">
                <xsd:sequence>
                    <xsd:element name="fields">
                        <xsd:annotation>
                            <xsd:documentation>Specify the set of fields to compare on update and delete.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="field" type="opm:field" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="sequencing-policy">
        <xsd:annotation>
            <xsd:documentation>Defines how a database generated unique id should be assigned to the class.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="sequence-name" type="xsd:string">
                <xsd:annotation>
                    <xsd:documentation>Specify the name of the sequence generator.  This could be the name of a sequence object, or a row value in a sequence table.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="sequence-field" type="opm:field">
                <xsd:annotation>
                    <xsd:documentation>Specify the field/column that the generated sequence id is assigned to.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="cache-type">
        <xsd:annotation>
            <xsd:documentation>Defines the set of valid caching types.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="none"/>
            <xsd:enumeration value="full"/>
            <xsd:enumeration value="cache"/>
            <xsd:enumeration value="weak-reference"/>
            <xsd:enumeration value="soft-cache-weak-reference"/>
            <xsd:enumeration value="hard-cache-weak-reference"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="caching-policy">
        <xsd:annotation>
            <xsd:documentation>Defines how the class' instances should be cached and how object identity should be maintained.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="cache-type" type="toplink:cache-type" default="soft-cache-weak-reference" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specify the type of caching, such as LRU, weak reference or none.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="cache-size" type="xsd:integer" default="100" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specify the initial or maximum size of the cache.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="always-refresh" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specify to always refresh cached objects on queries.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="only-refresh-cache-if-newer-version" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specify to refresh if the cached object is an older version.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="disable-cache-hits" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Disable obtaining cache hits on primary key queries.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="always-conform" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specify to always conform queries within a transaction.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="isolated" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specify if objects of this type should be isolated from the shared cache.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="unitofwork-isolation-level" type="toplink:unitofwork-isolation-level" default="isolate-new-data-after-transaction" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specify how the unit of work should be isolated to the session cache.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="cache-invalidation-policy" type="toplink:cache-invalidation" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines the cache invalidation policy.  By default there will be no cache invalidation policy.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="cache-sync-type" type="toplink:cache-sync-type" default="change-set" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The type of cache synchronization to be used with this descripor.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="cache-invalidation" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Abstract superclass for cache invalidation policies.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="update-read-time-on-update" type="xsd:boolean" default="false" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="no-expiry-cache-invalidation-policy">
        <xsd:annotation>
            <xsd:documentation>Cache invalidation policy where objects in the cache do not expire.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:cache-invalidation"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="time-to-live-cache-invalidation-policy">
        <xsd:annotation>
            <xsd:documentation>Cache invalidation policy where objects live a specific number of milliseconds after they are read.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:cache-invalidation">
                <xsd:sequence>
                    <xsd:element name="time-to-live" type="xsd:long"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="daily-cache-invalidation-policy">
        <xsd:annotation>
            <xsd:documentation>Cache invalidation Policy where objects expire at a specific time every day</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:cache-invalidation">
                <xsd:sequence>
                    <xsd:element name="expiry-time" type="xsd:dateTime"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="history-policy">
        <xsd:annotation>
            <xsd:documentation>Defines how past versions of objects are to be persisted to the data-store.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="handle-writes" type="xsd:boolean" default="true" minOccurs="0"/>
            <xsd:element name="use-database-time" type="xsd:boolean" default="false" minOccurs="0"/>
            <xsd:element name="history-tables" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines the names of the mirroring historical tables.</xsd:documentation>
                </xsd:annotation>
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="history-table" type="toplink:history-table" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="start-fields" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines the start fields for each historical table.</xsd:documentation>
                </xsd:annotation>
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="start-field" type="opm:field" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="end-fields" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines the end fields for each historical table.</xsd:documentation>
                </xsd:annotation>
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="end-field" type="opm:field" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="history-table">
        <xsd:annotation>
            <xsd:documentation>Each entry is a source (descriptor) to history table name association.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="source" type="xsd:string" default="" minOccurs="0"/>
            <xsd:element name="history" type="xsd:string" minOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="returning-policy">
        <xsd:annotation>
            <xsd:documentation>Defines retuning policy.  By default there will be no returning policy.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="returning-field-infos" minOccurs="1">
                <xsd:annotation>
                    <xsd:documentation>Lists the fields to be returned together with the flags defining returning options</xsd:documentation>
                </xsd:annotation>
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="returning-field-info" type="toplink:returning-field-info" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="returning-field-info">
        <xsd:annotation>
            <xsd:documentation>Field to be returned together with type and the flags defining returning options. At least one of insert, update should be true.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="reference-class" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The fully qualified name of the target referenced class.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="field" type="opm:field">
                <xsd:annotation>
                    <xsd:documentation>The field to be returned.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="insert" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Indicates whether the field should be retuned after Insert.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="insert-mode-return-only" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>If insert==true, indicates whether the field should not be inserted (true). If insert==false - ignored.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="update" type="xsd:boolean" default="false" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Indicates whether the field should be retuned after Insert.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="inheritance-policy">
        <xsd:annotation>
            <xsd:documentation>Defines how inheritance in a class hierarchy map to a type field in the database.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:inheritance-policy">
                <xsd:sequence>
                    <xsd:element name="read-subclasses-on-queries" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define if subclasses of the class should be returned on queries, or only the exact class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="all-subclasses-view" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optionally specify the name of a view that joins all of the subclass' tables.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="use-class-name-as-indicator" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies if the fully qualified class name should be used as the class type indicator.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="class-extraction-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name of a method on the class that takes the class' row as argument a computed that class type to be used to instantiate from the row.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="class-indicator-field" type="opm:field" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name of the type field/column that the class type is stored into.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="class-indicator-mappings" type="toplink:class-indicator-mappings" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The set of class indicator values and the subclasses they map to.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="class-extractor" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name of a class that implements a class extractor interface.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="only-instances-criteria" type="opm:criteria" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The criteria that filters out all sibling and subclass instances on queries.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="all-subclasses-criteria" type="opm:criteria" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The criteria that filters out sibling instances on queries.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="qname-inheritance-policy">
        <xsd:annotation>
            <xsd:documentation>Extends inheritance policy. Allows for prefixed names to be resolved at runtime to find the approriate class</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:inheritance-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="class-indicator-mappings">
        <xsd:annotation>
            <xsd:documentation>The set of class indicator values and the subclasses they map to.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="class-indicator-mapping" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="class" type="xsd:string">
                            <xsd:annotation>
                                <xsd:documentation>The fully qualified name of the class the type maps to.</xsd:documentation>
                            </xsd:annotation>
                        </xsd:element>
                        <xsd:element name="class-indicator" type="xsd:anySimpleType">
                            <xsd:annotation>
                                <xsd:documentation>The field value used to define the class type.</xsd:documentation>
                            </xsd:annotation>
                        </xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="event-policy">
        <xsd:annotation>
            <xsd:documentation>Defines the persistent events for this class.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:event-policy">
                <xsd:sequence>
                    <xsd:element name="post-build-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after building the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="pre-write-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed before writing the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="post-write-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after writing the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="pre-insert-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed before inserting the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="post-insert-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after inserting the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="pre-update-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed before updating the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="post-update-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after updating the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="pre-delete-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed before deleting the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="post-delete-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after deleting the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="about-to-insert-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed before inserting the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="about-to-update-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed before updating the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="post-clone-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after cloning the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="post-merge-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after merging the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="post-refresh-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Method executed after refreshing the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="query-policy">
        <xsd:annotation>
            <xsd:documentation>The list of defined queries and query properties for the class.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:query-policy">
                <xsd:sequence>
                    <xsd:element name="timeout" type="xsd:integer" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies a timeout to apply to all queries.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="existence" type="toplink:existence-policy" default="check-cache" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow the behavoir used to determine if an insert or update should occur for an object to be customized.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="insert-query" type="toplink:insert-object-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Custom insert query.  This overide the default insert behavoir for usage with stored procedures or custom calls.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="update-query" type="toplink:update-object-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Custom update query.  This overide the default update behavoir for usage with stored procedures or custom calls.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-query" type="toplink:delete-object-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Custom delete query.  This overide the default delete behavoir for usage with stored procedures or custom calls.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="does-exist-query" type="toplink:does-exist-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Custom does exist query.  This overide the default delete behavoir for usage with stored procedures or custom calls.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="read-object-query" type="toplink:read-object-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Custom read object query.  This overide the default read behavoir for usage with stored procedures or custom calls.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="read-all-query" type="toplink:read-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Custom read all query.  This overide the default read all behavoir for usage with stored procedures or custom calls.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="existence-policy">
        <xsd:annotation>
            <xsd:documentation>Defines the set of valid existence policies for determining if an insert or update should occur for an object.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="check-cache"/>
            <xsd:enumeration value="check-database"/>
            <xsd:enumeration value="assume-existence"/>
            <xsd:enumeration value="assume-non-existence"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="query-key">
        <xsd:annotation>
            <xsd:documentation>Defines an alias for querying database information.</xsd:documentation>
        </xsd:annotation>
        <xsd:attribute name="name" type="xsd:string">
            <xsd:annotation>
                <xsd:documentation>The query-key alias name.</xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
    </xsd:complexType>
    <xsd:simpleType name="cache-sync-type">
        <xsd:annotation>
            <xsd:documentation>The type of cache synchronization to use with a descriptor.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="invalidation"/>
            <xsd:enumeration value="no-changes"/>
            <xsd:enumeration value="change-set-with-new-objects"/>
            <xsd:enumeration value="change-set"/>
            </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="unitofwork-isolation-level">
        <xsd:annotation>
            <xsd:documentation>Specify how the unit of work isolated from the session cache.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="use-session-cache-after-transaction"/>
            <xsd:enumeration value="isolate-new-data-after-transaction"/>
            <xsd:enumeration value="isolate-cache-after-transaction"/>
            <xsd:enumeration value="isolate-cache-always"/>
            </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="direct-query-key">
        <xsd:annotation>
            <xsd:documentation>Defines an alias for a database column.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:query-key">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The field/column being aliased.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="relationship-query-key" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines an alias for a join to another class' table.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:query-key">
                <xsd:sequence>
                    <xsd:element name="reference-class" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The fully qualified name of the target referenced class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:choice>
                        <xsd:element name="foreign-key" type="opm:foreign-key">
                            <xsd:annotation>
                                <xsd:documentation>The foreign key join condition between the source and target class' tables.</xsd:documentation>
                            </xsd:annotation>
                        </xsd:element>
                        <xsd:element name="criteria" type="opm:criteria">
                            <xsd:annotation>
                                <xsd:documentation>The join criteria between the source and target class' tables.</xsd:documentation>
                            </xsd:annotation>
                        </xsd:element>
                    </xsd:choice>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="one-to-one-query-key">
        <xsd:annotation>
            <xsd:documentation>Defines an alias for a 1-1 join to another class' table.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:relationship-query-key"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="one-to-many-query-key">
        <xsd:annotation>
            <xsd:documentation>Defines an alias for a 1-m join from another class' table.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:relationship-query-key"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="abstract-direct-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping from an attirbute to a simple field datatype, i.e. String, Number, Date.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:direct-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="direct-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping from an attirbute to a simple field datatype, i.e. String, Number, Date.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-direct-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-direct-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping from an attirbute to a simple field datatype, i.e. String, Number, Date.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-direct-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-direct-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping from an attirbute to a simple field datatype, i.e. String, Number, Date.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-direct-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="object-type-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping from a finite set of simple object values to a set of data values.  This makes use of the object-type-converter.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:direct-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="type-conversion-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping from object type to a data type that requires simple conversion.  This makes use of the type-conversion-converter.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:direct-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="serialized-object-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping that serializes the object value into a binary data value.  This makes use of the serialized-object-converter.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:direct-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="field-transformation" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines a field transformation for a transformation mapping</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="field" type="opm:field"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="method-based-field-transformation">
        <xsd:complexContent>
            <xsd:extension base="toplink:field-transformation">
                <xsd:sequence>
                    <xsd:element name="method" type="xsd:string"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="transformer-based-field-transformation">
        <xsd:complexContent>
            <xsd:extension base="toplink:field-transformation">
                <xsd:sequence>
                    <xsd:element name="transformer-class" type="xsd:string"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="abstract-transformation-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a transformation mapping that uses Java code to transform between the data and object values.</xsd:documentation>
            <xsd:documentation>This can be used if a single attribute maps to multiple fields, or field only mappings or attribute only mappings.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="attribute-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name of the attribute transformation defined in the domain class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="attribute-transformer" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The class name of the attribute transformer. Used in place of attribute-transformation.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="mutable" type="xsd:boolean" default="true" minOccurs="0"/>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0"/>
                    <xsd:element name="field-transformations" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The field transformations.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="field-transformation" type="toplink:field-transformation" minOccurs="0" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="transformation-mapping">
        <xsd:annotation>
            <xsd:documentation>This can be used if a single attribute maps to multiple fields, or field only mappings or attribute only mappings.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-transformation-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-transformation-mapping">
        <xsd:annotation>
            <xsd:documentation>This can be used if a single attribute maps to multiple fields, or field only mappings or attribute only mappings.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-transformation-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-transformation-mapping">
        <xsd:annotation>
            <xsd:documentation>This can be used if a single attribute maps to multiple fields, or field only mappings or attribute only mappings.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-transformation-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="aggregate-object-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a relationship where the target object is strictly privately owned by the source object and stores within the source objects row</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="reference-class" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The fully qualified class name of the target class of the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="allow-null" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if a row of all nulls should be interpreted as null.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="field-translations" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow for the mapping to use different field names than the descriptor.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="field-translation" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:complexType>
                                        <xsd:sequence>
                                            <xsd:element name="source-field" type="opm:field">
                                                <xsd:annotation>
                                                    <xsd:documentation>The field in the source descriptor's table.</xsd:documentation>
                                                </xsd:annotation>
                                            </xsd:element>
                                            <xsd:element name="target-field" type="opm:field">
                                                <xsd:annotation>
                                                    <xsd:documentation>The field in the aggregate descriptor.</xsd:documentation>
                                                </xsd:annotation>
                                            </xsd:element>
                                        </xsd:sequence>
                                    </xsd:complexType>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="one-to-one-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a 1-1 relationship from the source instance to the target instance.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:one-to-one-mapping">
                <xsd:sequence>
                    <xsd:element name="bidirectional-target-attribute" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="batch-reading" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify to optimize reads for the class by batching the reads to this relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="joining" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify to optimize reads for the class by joining the reads to this relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:read-object-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-one-to-one-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a 1-1 relationship from the source instance to the target instance.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:one-to-one-mapping">
                <xsd:sequence>
                    <xsd:element name="bidirectional-target-attribute" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:read-object-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="one-to-many-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a 1-m relationship from the source instance to the target instances.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:one-to-many-mapping">
                <xsd:sequence>
                    <xsd:element name="bidirectional-target-attribute" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="batch-reading" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify to optimize reads for the class by batching the reads to this relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:read-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-all-query" type="toplink:delete-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to delete all of the related objects can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-one-to-many-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a 1-m relationship from the source instance to the target instances.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:relationship-mapping">
                <xsd:sequence>
                    <xsd:element name="source-foreign-key-fields" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The set of foreign key fields populated by this relationship in the source class' table.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="field" type="opm:field" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>The set of foreign key fields populated by this relationship in the source class' table.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="target-foreign-key-fields" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The set of foreign key fields populated by this relationship in the source class' table.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="field" type="opm:field" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>The set of foreign key fields populated by this relationship in the source class' table.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="foreign-key-grouping-element" type="opm:field" minOccurs="0"/>
                    <xsd:element name="bidirectional-target-attribute" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:read-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-all-query" type="toplink:delete-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to delete all of the related objects can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="direct-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a collection of simple types relationship from the source instance to a set of simple data values.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="batch-reading" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify to optimize reads for the class by batching the reads to this relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:data-read-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target data values.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="reference-table" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The name of the reference table that stores the source primary key and the data values.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="direct-field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The field/column in the reference table that stores the data values.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="reference-foreign-key" type="opm:foreign-key">
                        <xsd:annotation>
                            <xsd:documentation>The foreign key in the reference table that defines the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="value-converter" type="opm:value-converter" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optionally specify how the data value should be converted to the object value.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="insert-query" type="toplink:data-modify-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to insert a row into the reference table can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-query" type="toplink:data-modify-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to delete a row from the reference table can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-all-query" type="toplink:data-modify-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to delete all of the rows from the reference table can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="session-name" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name session that defines the reference table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="history-policy" type="toplink:history-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines how past versions of this attribute are persisted to the data-store.  By default there will be no history policy.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="direct-map-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a map relationship from the source instance to a set of key values pairs of simple data values.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:direct-collection-mapping">
                <xsd:sequence>
                    <xsd:element name="direct-key-field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The field/column in the reference table that sores the map key data value.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="key-converter" type="opm:value-converter" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optionally specify how the key data value should be converted to the object value.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="aggregate-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a 1-m relationship from the source instance to the target instances where the target instances are strictly privately owned by the source object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:relationship-mapping">
                <xsd:sequence>
                    <xsd:element name="target-foreign-key" type="opm:foreign-key">
                        <xsd:annotation>
                            <xsd:documentation>The foreign key in the target class' table that defines the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="bidirectional-target-attribute" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="batch-reading" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify to optimize reads for the class by batching the reads to this relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:read-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-all-query" type="toplink:delete-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to delete all of the related objects can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="many-to-many-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a m-m relationship from the source instance to the target instances.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:many-to-many-mapping">
                <xsd:sequence>
                    <xsd:element name="bidirectional-target-attribute" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="batch-reading" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify to optimize reads for the class by batching the reads to this relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:read-all-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="insert-query" type="toplink:data-modify-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to insert a row into the relation table can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-query" type="toplink:data-modify-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to delete a row from the relation table can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="delete-all-query" type="toplink:data-modify-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>A query to delete all of the rows from the relation table can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="history-policy" type="toplink:history-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines how past versions of this attribute are persisted to the data-store.  By default there will be no history policy.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="variable-one-to-one-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a 1-1 relationship from the source instance to the target instance that may be of several types related through an interface.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:relationship-mapping">
                <xsd:sequence>
                    <xsd:element name="bidirectional-target-attribute" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="batch-reading" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify to optimize reads for the class by batching the reads to this relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="indirection" type="toplink:indirection-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="selection-query" type="toplink:read-object-query" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="type-field" type="opm:field" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify the column to store the class type of the related object into.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="foreign-key-fields" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The set of foreign key fields populated by this relationship in the source class' table.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="field" type="opm:field" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>The set of foreign key fields populated by this relationship in the source class' table.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="foreign-key-to-query-key">
                        <xsd:annotation>
                            <xsd:documentation>The list of source/target column/query key references relating a foreign key in one table to the query keys defining a primary or unique key value in the other interface descriptor.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="query-key-reference" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>The reference of a source table foreign key and a target interface descriptor query key.</xsd:documentation>
                                    </xsd:annotation>
                                    <xsd:complexType>
                                        <xsd:sequence>
                                            <xsd:element name="source-field" type="opm:field">
                                                <xsd:annotation>
                                                    <xsd:documentation>The foreign key field/column name in the source table.</xsd:documentation>
                                                </xsd:annotation>
                                            </xsd:element>
                                            <xsd:element name="target-query-key" type="xsd:string">
                                                <xsd:annotation>
                                                    <xsd:documentation>The query key name of the target interface descriptor.</xsd:documentation>
                                                </xsd:annotation>
                                            </xsd:element>
                                        </xsd:sequence>
                                    </xsd:complexType>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="class-indicator-mappings" type="toplink:class-indicator-mappings" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The set of class indicator values and the subclasses they map to.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="container-policy">
        <xsd:annotation>
            <xsd:documentation>Defines a container/collection type.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="collection-type" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Specifies the fully qualified class name of the collection implementation class.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="list-container-policy">
        <xsd:annotation>
            <xsd:documentation>Defines a list collection type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:container-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="map-container-policy">
        <xsd:annotation>
            <xsd:documentation>Defines a map container type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:container-policy">
                <xsd:sequence>
                    <xsd:element name="map-key-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the method to call on the target objects to get the key value for the map.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="direct-map-container-policy">
        <xsd:annotation>
            <xsd:documentation>Defines a direct map container type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:container-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="indirection-policy" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines a deferred read indirection mechanism.</xsd:documentation>
        </xsd:annotation>
    </xsd:complexType>
    <xsd:complexType name="value-holder-indirection-policy">
        <xsd:annotation>
            <xsd:documentation>Defines usage of value holders to implement indirection.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:indirection-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="proxy-indirection-policy">
        <xsd:annotation>
            <xsd:documentation>Defines usage of proxies to implement indirection.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:indirection-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="transparent-collection-indirection-policy">
        <xsd:annotation>
            <xsd:documentation>Defines usage of transparent collections to implement indirection.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:indirection-policy">
                <xsd:sequence>
                    <xsd:element name="collection-type" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the fully qualified class name of the collection interface to use, i.e. List, Set, Map.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="map-key-method" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the method to call on the target objects to get the key value for the map.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="container-indirection-policy">
        <xsd:annotation>
            <xsd:documentation>Defines usage of a user defined container to implement indirection.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:indirection-policy">
                <xsd:sequence>
                    <xsd:element name="container-type" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the fully qualified class name of the container implementer to use.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="typesafe-enumeration-converter">
        <xsd:annotation>
            <xsd:documentation>Typesafe Enumeration conversion</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:value-converter"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="type-conversion-converter">
        <xsd:annotation>
            <xsd:documentation>Specifies the data type and an object type of the attribute to convert between.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:value-converter">
                <xsd:sequence>
                    <xsd:element name="object-class" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the fully qualified class name of the attribute type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="data-class" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the fully qualified class name of the attributes storage data type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="serialized-object-converter">
        <xsd:annotation>
            <xsd:documentation>Uses object serialization to convert between the object and data type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:value-converter">
                <xsd:sequence>
                    <xsd:element name="data-type" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the fully qualified class name of the attributes storage data type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="object-type-converter">
        <xsd:annotation>
            <xsd:documentation>Specifies a mapping of values from database values used in the field and object values used in the attribute.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:value-converter">
                <xsd:sequence>
                    <xsd:element name="default-value" type="xsd:anySimpleType" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>An optional default value can be specified.  This value is used if a database type is not found in the type mapping.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="type-mappings">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the mapping of values.  Both the object and database values must be unique.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="type-mapping" type="toplink:type-mapping" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Defines the object and data value mapping.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="attribute-only-type-mappings" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies a mapping of additional values that map non-unique data values to a unique attribute value.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="type-mapping" type="toplink:type-mapping" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Defines the object and data value mapping.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="type-mapping">
        <xsd:annotation>
            <xsd:documentation>Define an object and data value mapping.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="object-value" type="xsd:anySimpleType">
                <xsd:annotation>
                    <xsd:documentation>Specifies the value to use in the object's attribute.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="data-value" type="xsd:anySimpleType">
                <xsd:annotation>
                    <xsd:documentation>Specifies the value to use in the database field.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="database-query" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines a query/interaction against a database.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:query">
                <xsd:sequence>
                    <xsd:element name="maintain-cache" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies if the query should bypass the cache completely.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="bind-all-parameters" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies if the query should use paramater binding for arguments, or print the arguments in-line.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="cache-statement" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies if the queries statement should be cached, this must be used with parameter binding.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="timeout" type="xsd:integer" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies a timeout to cancel the query in if the request takes too long to complete.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="prepare" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies if the query should prepare and cache its generated SQL, or regenerate the SQL on each execution.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="call" type="opm:criteria" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>For static calls the SQL or Stored Procedure call definition can be specified.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="cascade-policy">
        <xsd:annotation>
            <xsd:documentation>Defines the set of valid cascade policies.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="none"/>
            <xsd:enumeration value="private"/>
            <xsd:enumeration value="all"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="value-read-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for reading a single value.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:direct-read-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="direct-read-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for reading a collection of values.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:data-read-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="data-read-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for reading raw data.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:read-query">
                <xsd:sequence>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="read-query" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines a query for reading.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:database-query">
                <xsd:sequence>
                    <xsd:element name="cache-query-results" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies if the query should cache the query results to avoid future executions.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="max-rows" type="xsd:integer" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the maximum number of rows to fetch, results will be trunctate on the database to this size.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="first-result" type="xsd:integer" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies where to start the cursor in a result set returned from the database. Results prior to this number will not be built into objects</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="fetch-size" type="xsd:integer" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifiess the number of rows to fetch from the database on each result set next operation.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="query-result-cache-policy" type="toplink:query-result-cache-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify how the query results should be cached.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="query-result-cache-policy">
        <xsd:annotation>
            <xsd:documentation>Defines how a query's results should be cached.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="invalidation-policy" type="toplink:cache-invalidation" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines the cache invalidation policy. By default there will be no cache invalidation policy.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="maximum-cached-results" type="xsd:integer" default="100" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>This defines the number of query result sets that will be cached. The LRU query results will be discarded when the max size is reached.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="data-modify-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for manipulating data.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:database-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="object-modify-query" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines a query for modifying an object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:database-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="update-object-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for updating an object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:object-modify-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="insert-object-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for inserting an object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:object-modify-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="delete-object-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for deleting an object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:object-modify-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="does-exist-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for determining if an object exists.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:database-query">
                <xsd:sequence>
                    <xsd:element name="existence-check" type="toplink:existence-check" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The existence check option.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="existence-check">
        <xsd:annotation>
            <xsd:documentation>Defines the set of valid existence check options.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="check-cache"/>
            <xsd:enumeration value="check-database"/>
            <xsd:enumeration value="assume-existence"/>
            <xsd:enumeration value="assume-non-existence"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="delete-all-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for deleting a criteria of objects.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:database-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="object-level-read-query" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines a query for objects (as apposed to data).</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:read-query">
                <xsd:sequence>
                    <xsd:element name="reference-class" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The full qualified name of the class of objects being queried.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="refresh" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the query should refresh any cached objects from the database.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="remote-refresh" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the query should refresh any remotely cached objects from the server.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="cascade-policy" type="toplink:cascade-policy" default="none" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies if the queries settings (such as refresh, maintain-cache) should apply to the object's relationship queries.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="cache-usage" type="xsd:string" default="primary-key" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify how the query should interact with the cache.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="lock-mode" type="xsd:string" default="none" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the query should lock the resulting rows on the database.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="distinct-state" type="xsd:string" default="none" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the query should filter distinct results.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="in-memory-querying" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The in memory querying policy.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="policy" type="xsd:string" default="ignore-exceptions-return-conformed">
                                    <xsd:annotation>
                                        <xsd:documentation>Specify how indirection or unconformable expressions should be treating with in-memory querying and conforming.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="use-default-fetch-group" type="xsd:boolean" default="true" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the default fetch group should be used for the query.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="fetch-group" type="toplink:fetch-group" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Allow the query to partially fetch the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="fetch-group-name" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify a pre-defined named fetch group to allow the query to partially fetch the object.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="use-exclusive-connection" type="xsd:boolean" default="false" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specify if the exclusive connection (VPD) should be used for the query.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="joined-attribute-expressions" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies the attributes being joined.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="expression" type="toplink:expression" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Represents an expression for joining</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="read-all-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for a set of objects.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:object-level-read-query">
                <xsd:sequence>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="batch-read-attribute-expressions" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Specifies all attributes for batch reading.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="expression" type="toplink:expression" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Represents an expression for batch reading</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="order-by-expressions" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Sets the order expressions for the query.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="expression" type="toplink:expression" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Represents an expression for ordering</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="read-object-query">
        <xsd:annotation>
            <xsd:documentation>Defines a query for a single object.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:object-level-read-query"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="report-query">
        <xsd:annotation>
            <xsd:documentation>Query for information about a set of objects instead of the objects themselves.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:read-all-query">
                <xsd:sequence>
                    <xsd:element name="return-choice" type="toplink:return-choice" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Simplifies the result by only returning the first result, first value, or all attribute values.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="retrieve-primary-keys" type="toplink:retrieve-primary-keys" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Indicates wether the primary key values should also be retrieved for the reference class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="report-items" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Items to be selected, these could be attributes or aggregate functions.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="item" type="toplink:report-item" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Represents an item requested</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="group-by-expressions" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Sets GROUP BY expressions for the query.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="expression" type="toplink:expression" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Represents an expression for grouping</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="return-choice">
        <xsd:annotation>
            <xsd:documentation>Simplifies the result by only returning the first result, first value, or all attribute values.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="return-single-result"/>
            <xsd:enumeration value="return-single-value"/>
            <xsd:enumeration value="return-single-attribute"/>
            </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="retrieve-primary-keys">
        <xsd:annotation>
            <xsd:documentation>Indicates wether the primary key values should also be retrieved for the reference class.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="full-primary-key"/>
            <xsd:enumeration value="first-primary-key"/>
            <xsd:enumeration value="no-primary-key"/>
            </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="report-item">
        <xsd:annotation>
            <xsd:documentation>Represents an item requested in ReportQuery.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string">
                <xsd:annotation>
                    <xsd:documentation>Name given for item, can be used to retieve value from result.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="attribute-expression" type="toplink:expression">
                <xsd:annotation>
                    <xsd:documentation>Expression (partial) that describes the attribute wanted.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="expression" abstract="true">
        <xsd:annotation>
            <xsd:documentation>Defines a query filter expression tree.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:criteria"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="relation-expression">
        <xsd:annotation>
            <xsd:documentation>Defines a relation expression that compares to expressions through operators such as equal, lessThan, etc..</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression">
                <xsd:sequence>
                    <xsd:element name="left" type="toplink:expression"/>
                    <xsd:element name="right" type="toplink:expression"/>
                </xsd:sequence>
                <xsd:attribute name="operator" type="toplink:operator"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="logic-expression">
        <xsd:annotation>
            <xsd:documentation>Defines a expression composed of two sub-expressions joined through an operator such as AND, OR.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression">
                <xsd:sequence>
                    <xsd:element name="left" type="toplink:expression"/>
                    <xsd:element name="right" type="toplink:expression"/>
                </xsd:sequence>
                <xsd:attribute name="operator" type="toplink:operator"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="function-expression">
        <xsd:annotation>
            <xsd:documentation>Defines a expression composed of a function applied to a list of sub-expressions.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression">
                <xsd:sequence>
                    <xsd:element name="arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of function arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:expression" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Defines an argument expression.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
                <xsd:attribute name="function" type="toplink:operator"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="constant-expression">
        <xsd:annotation>
            <xsd:documentation>Defines an expression value.  If the value is null the value tag can is absent.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression">
                <xsd:sequence>
                    <xsd:element name="value" type="xsd:anySimpleType" minOccurs="0"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="query-key-expression">
        <xsd:annotation>
            <xsd:documentation>Defines an expression query-key.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression">
                <xsd:sequence>
                    <xsd:element name="base" type="toplink:expression"/>
                </xsd:sequence>
                <xsd:attribute name="name" type="xsd:string"/>
                <xsd:attribute name="any-of" type="xsd:boolean"/>
                <xsd:attribute name="outer-join" type="xsd:boolean"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="field-expression">
        <xsd:annotation>
            <xsd:documentation>Defines an expression field.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field"/>
		    <xsd:element name="base" type="toplink:expression"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="parameter-expression">
        <xsd:annotation>
            <xsd:documentation>Defines an expression parameter.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression">
                <xsd:sequence>
                    <xsd:element name="parameter" type="opm:field"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="base-expression">
        <xsd:annotation>
            <xsd:documentation>Defines an expression builder/base.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:expression"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="operator">
        <xsd:annotation>
            <xsd:documentation>Defines the set of valid operators.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="sql-call">
        <xsd:annotation>
            <xsd:documentation>Defines an SQL query language string.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:criteria">
                <xsd:sequence>
                    <xsd:element name="sql" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The full SQL query string.  Arguments can be specified through #arg-name tokens in the string.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="ejbql-call">
        <xsd:annotation>
            <xsd:documentation>Defines an EJB-QL query language string.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:criteria">
                <xsd:sequence>
                    <xsd:element name="ejbql" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The EJB-QL query string.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="stored-procedure-call">
        <xsd:annotation>
            <xsd:documentation>Defines a stored procedure invocation definition.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:criteria">
                <xsd:sequence>
                    <xsd:element name="procedure-name" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The name of the stored procedure.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="cursor-output-procedure" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the call to use a cursor output parameter to define the result set.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of input and output arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:procedure-argument" minOccurs="0" maxOccurs="unbounded">
                                    <xsd:annotation>
                                        <xsd:documentation>Defines an argument to the procedure. The order of the arguments must match the procedure arguments if not named.</xsd:documentation>
                                    </xsd:annotation>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="procedure-argument">
        <xsd:annotation>
            <xsd:documentation>Defines a stored procedure call argument.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="procedure-argument-name" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The stored procedure name of the argument. For indexed argument the name is not required.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="argument-name" type="xsd:string" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The query name of the argument. This is the name of the argument as define in the query.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="argument-value" type="xsd:anySimpleType" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The procedure argument value maybe be specified if not using a query argument.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="procedure-output-argument">
        <xsd:annotation>
            <xsd:documentation>Defines a stored procedure call output argument.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:procedure-argument">
                <xsd:sequence>
                    <xsd:element name="procedure-output-argument-type" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The fully qualified name of the output argument class type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="procedure-inoutput-argument">
        <xsd:annotation>
            <xsd:documentation>Defines a stored procedure call output argument.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:procedure-output-argument">
                <xsd:sequence>
                    <xsd:element name="output-argument-name" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The query name of the argument. This is the name of the argument as define in the query.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-class-mapping-descriptor">
        <xsd:annotation>
            <xsd:documentation>Defines a class mapping to an EIS record data structure.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:class-mapping-descriptor">
                <xsd:sequence>
                    <xsd:element name="datatype" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The name of the record structure name the descriptor maps to.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="namespace-resolver" type="toplink:namespace-resolver" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The namespace resolver for the descriptor.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="mapped-interaction">
        <xsd:annotation>
            <xsd:documentation>Defines an EIS interaction utilizing MappedRecord.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:criteria">
                <xsd:sequence>
                    <xsd:element name="function-name" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The name of the function.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="input-result-path" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optional root key if the input result is not at the record root.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="output-result-path" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optional root key if the output result is not at the record root.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="input-arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of input arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:interaction-argument" minOccurs="0" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="output-arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of output arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:interaction-argument" minOccurs="0" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-interaction">
        <xsd:annotation>
            <xsd:documentation>Defines an EIS interaction utilizing XML records.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:criteria">
                <xsd:sequence>
                    <xsd:element name="function-name" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The name of the function.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="input-record-name" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name to use for the input record, if required by the adapter.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="input-root-element-name" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optional root key if the output result is not at the record root.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="input-result-path" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optional root key if the input result is not at the record root.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="output-result-path" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optional root key if the output result is not at the record root.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="input-arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of input arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:interaction-argument" minOccurs="0" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="output-arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of output arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:interaction-argument" minOccurs="0" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="indexed-interaction">
        <xsd:annotation>
            <xsd:documentation>Defines an EIS interaction utilizing Indexed records.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:criteria">
                <xsd:sequence>
                    <xsd:element name="function-name" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The name of the function.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="input-arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of input arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:interaction-argument" minOccurs="0" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                    <xsd:element name="output-arguments" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The list of output arguments.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="argument" type="toplink:interaction-argument" minOccurs="0" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="interaction-argument">
        <xsd:annotation>
            <xsd:documentation>Defines an interaction argument.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="argument-value" type="xsd:anySimpleType" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>The procedure argument value maybe be specified if not using a query argument.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string">
            <xsd:annotation>
                <xsd:documentation>The interaction name of the argument. For indexed arguments the name is not required.</xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="argument-name" type="xsd:string">
            <xsd:annotation>
                <xsd:documentation>The query name of the argumen. This is the name of the argument as define in the query, or the descriptor field name.</xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
    </xsd:complexType>
    <xsd:complexType name="object-relational-class-mapping-descriptor">
        <xsd:annotation>
            <xsd:documentation>Defines a class mapping to a Structure type in an object-relational database.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:relational-class-mapping-descriptor">
                <xsd:sequence>
                    <xsd:element name="structure" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>The name of the object structure type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="field-order" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The ordered list of the field defined in the structure.</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="field" type="opm:field" maxOccurs="unbounded"/>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="nested-table-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a 1-m/m-m relationship that makes use of the object-relational nested-table type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:relationship-mapping">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The field/column in the source table that stores the nested-table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="structure" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>Specify the object-relational type name of the nested-table type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="array-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a collection of primitive/simple type values using the object-relational array type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The field/column in the source table that stores the nested-table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="structure" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>Specify the object-relational type name of the array type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="object-array-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a collection of object-types using the object-relational array type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:relationship-mapping">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The field in the source type that stores the array.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="structure" type="xsd:string">
                        <xsd:annotation>
                            <xsd:documentation>Specify the object-relational type name of the array type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="reference-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a reference to another object-type using the object-relational reference type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:relationship-mapping">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field">
                        <xsd:annotation>
                            <xsd:documentation>The field in the source type that stores the reference.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="direct-xml-type-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a direct mapping to an Oracle XDB XML Type.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:direct-mapping">
                <xsd:sequence>
                    <xsd:element name="read-whole-document" type="xsd:boolean" minOccurs="0"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="abstract-composite-direct-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a direct collection mapping for an XML list of elements.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field"/>
                    <xsd:element name="value-converter" type="opm:value-converter" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optionally specify how the data value should be converted to the object value.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="value-converter-class" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Optionally specify a user defined converter class.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-composite-direct-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a direct collection mapping for an XML list of elements.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-composite-direct-collection-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-composite-direct-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a direct collection mapping for an XML list of elements.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-composite-direct-collection-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="abstract-composite-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a composite collection mapping for an XML list of nested elements.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="reference-class" type="xsd:string"/>
                    <xsd:element name="field" type="opm:field"/>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-composite-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a composite collection mapping for an XML list of nested elements.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-composite-collection-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-composite-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a composite collection mapping for an XML list of nested elements.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-composite-collection-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="abstract-composite-object-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a composite object mapping for an XML nested element.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="reference-class" type="xsd:string"/>
                    <xsd:element name="field" type="opm:field"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-composite-object-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a composite object mapping for an XML nested element.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-composite-object-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="eis-composite-object-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a composite object mapping for an XML nested element.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:abstract-composite-object-mapping"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-class-mapping-descriptor">
        <xsd:annotation>
            <xsd:documentation>Defines a class mapping to an XML element.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:class-mapping-descriptor">
                <xsd:sequence>
                    <xsd:element name="default-root-element" type="xsd:string" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The name of the element the descriptor maps to.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="should-preserve-document" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Indicates if nodes should be cached to preserve unmapped data</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="namespace-resolver" type="toplink:namespace-resolver" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The namespace resolver for the descriptor.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="schema" type="toplink:schema-reference" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The location of the XML Schema.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-any-collection-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping of a collection to an xs:any declaration or xs:anyType element</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field" minOccurs="0"/>
                    <xsd:element name="container" type="toplink:container-policy" minOccurs="0"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-any-object-mapping">
        <xsd:annotation>
            <xsd:documentation>Defines a mapping of a single object to an xs:any declaration</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:attribute-mapping">
                <xsd:sequence>
                    <xsd:element name="field" type="opm:field" minOccurs="0"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-conversion-pair">
        <xsd:sequence>
            <xsd:element name="qname" type="xsd:string"/>
            <xsd:element name="class-name" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="node">
        <xsd:annotation>
            <xsd:documentation>Defines an XPath expression to an element or attribute in an XML document.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:field">
                <xsd:sequence>
                    <xsd:element name="position" type="xsd:integer" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>The position of the node in the parent type.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="typed-text-field" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>If this is a typed text field.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="single-node" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Indicates if each item in the collection is in the same node instead of having one node per item in the collection</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="schema-type" type="xsd:string" minOccurs="0" maxOccurs="unbounded">
                        <xsd:annotation>
                            <xsd:documentation>The schema type of the element.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="xml-to-java-conversion-pair" type="toplink:xml-conversion-pair" minOccurs="0" maxOccurs="unbounded"/>
                    <xsd:element name="java-to-xml-conversion-pair" type="toplink:xml-conversion-pair" minOccurs="0" maxOccurs="unbounded"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="union-node">
        <xsd:annotation>
            <xsd:documentation>Use to represent nodes which are mapped to unions</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="opm:field">
                <xsd:sequence>
                    <xsd:element name="typed-text-field" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>If this is a typed text field.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="single-node" type="xsd:boolean" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Indicates if each item in the collection is in the same node instead of having one node per item in the collection</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="schema-type" type="xsd:string" minOccurs="0" maxOccurs="unbounded">
                        <xsd:annotation>
                            <xsd:documentation>The schema type of the element.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="xml-to-java-conversion-pair" type="toplink:xml-conversion-pair" minOccurs="0" maxOccurs="unbounded"/>
                    <xsd:element name="java-to-xml-conversion-pair" type="toplink:xml-conversion-pair" minOccurs="0" maxOccurs="unbounded"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="namespace-resolver">
        <xsd:sequence>
            <xsd:element name="namespaces" minOccurs="0" maxOccurs="1">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="namespace" type="toplink:namespace" minOccurs="0" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="namespace">
        <xsd:sequence>
            <xsd:element name="prefix" type="xsd:string"/>
            <xsd:element name="namespace-uri" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="schema-reference">
        <xsd:sequence>
            <xsd:element name="resource" type="xsd:string"/>
            <xsd:element name="schema-context" type="xsd:string"/>
            <xsd:element name="node-type" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="schema-class-path-reference">
        <xsd:complexContent>
            <xsd:extension base="toplink:schema-reference"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="schema-file-reference">
        <xsd:complexContent>
            <xsd:extension base="toplink:schema-reference"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="schema-url-reference">
        <xsd:complexContent>
            <xsd:extension base="toplink:schema-reference"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:simpleType name="java-character">
        <xsd:restriction base="xsd:string"/>
    </xsd:simpleType>
    <xsd:simpleType name="java-timestamp">
        <xsd:restriction base="xsd:dateTime"/>
    </xsd:simpleType>
    <xsd:simpleType name="java-util-date">
        <xsd:restriction base="xsd:dateTime"/>
    </xsd:simpleType>
    <xsd:complexType name="cmp-policy">
        <xsd:sequence>
            <xsd:element name="pessimistic-locking" type="toplink:pessimistic-locking" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines the cmp bean-level pessimistic locking policy.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="defer-until-commit" type="toplink:defer-until-commit" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines modification deferral level for non-deferred writes.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="non-deferred-create-time" type="toplink:non-deferred-create-time" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Defines point at which insert will be issued to Database.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="pessimistic-locking">
        <xsd:sequence>
            <xsd:element name="locking-mode" type="toplink:locking-mode" default="wait" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="defer-until-commit">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="all-modifications"/>
            <xsd:enumeration value="update-modifications"/>
            <xsd:enumeration value="none"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="non-deferred-create-time">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="after-ejbcreate"/>
            <xsd:enumeration value="after-ejbpostcreate"/>
            <xsd:enumeration value="undefined"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="locking-mode">
        <xsd:annotation>
            <xsd:documentation>Holds the pessimistic locking mode.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="wait"/>
            <xsd:enumeration value="no-wait"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="sequence">
        <xsd:annotation>
            <xsd:documentation>Sequence object.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string" default="" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Sequence name.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:element name="preallocation-size" type="xsd:integer" default="50" minOccurs="0">
                <xsd:annotation>
                    <xsd:documentation>Sequence preallocation size.</xsd:documentation>
                </xsd:annotation>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="default-sequence">
        <xsd:annotation>
            <xsd:documentation>References default sequence object, overriding its name and (optionally) preallocation size.</xsd:documentation>
            <xsd:documentation>To use preallocation size of default sequence object, set preallocation size to 0</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:sequence"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="native-sequence">
        <xsd:annotation>
            <xsd:documentation>Database sequence mechanism used.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:sequence"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="table-sequence">
        <xsd:annotation>
            <xsd:documentation>Table sequence</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:sequence">
                <xsd:sequence>
                    <xsd:element name="table" type="xsd:string" default="SEQUENCE" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the name of the sequence table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="name-field" type="xsd:string" default="SEQ_NAME" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the name of the sequence name field in the sequence table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="counter-field" type="xsd:string" default="SEQ_COUNT" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the name of the sequence counter field in the sequence table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="unary-table-sequence">
        <xsd:annotation>
            <xsd:documentation>Unary table sequence - sequence name is a table name, table has a single field and a single row</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:sequence">
                <xsd:sequence>
                    <xsd:element name="counter-field" type="xsd:string" default="SEQUENCE" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the name of the sequence counter field in the sequence table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xmlfile-sequence">
        <xsd:annotation>
            <xsd:documentation>Xmlfile sequence.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:sequence"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="xml-sequence">
        <xsd:annotation>
            <xsd:documentation>Xml sequence</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:sequence">
                <xsd:sequence>
                    <xsd:element name="root-element" type="xsd:string" default="SEQUENCE" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the name of the sequence table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="name-element" type="xsd:string" default="SEQ_NAME" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the name of the sequence name field in the sequence table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="counter-element" type="xsd:string" default="SEQ_COUNT" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation>Define the name of the sequence counter field in the sequence table.</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="fetch-groups">
        <xsd:annotation>
            <xsd:documentation>Contains all pre-defined fetch groups.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="default-fetch-group" type="toplink:fetch-group" minOccurs="0"/>
            <xsd:element name="fetch-group" type="toplink:fetch-group" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="fetch-group">
        <xsd:annotation>
            <xsd:documentation>Contains the fetch group attributes info.</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string" minOccurs="0"/>
            <xsd:element name="fetch-group-attributes">
                <xsd:complexType>
                    <xsd:annotation>
                        <xsd:documentation>Contains a fetch group's attribute list.</xsd:documentation>
                    </xsd:annotation>
                    <xsd:sequence>
                        <xsd:element name="fetch-group-attribute" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="change-policy">
        <xsd:annotation>
            <xsd:documentation>Describes the change tracking policy for this descriptor.</xsd:documentation>
        </xsd:annotation>
    </xsd:complexType>
    <xsd:complexType name="deferred-detection-change-policy">
        <xsd:annotation>
            <xsd:documentation>Uses backup clone to detect changes.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:change-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="object-level-change-policy">
        <xsd:annotation>
            <xsd:documentation>Uses "mark dirty" to detect changes.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:change-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="attribute-level-change-policy">
        <xsd:annotation>
            <xsd:documentation>Uses a ChangeTracker firing PropertyChangeEvent's to detect changes.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="toplink:change-policy"/>
        </xsd:complexContent>
    </xsd:complexType>
</xsd:schema>
