<?xml version="1.0" encoding="utf-8"?>
<!--
******************************************************************************
 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
*****************************************************************************/
-->
<!-- Eclipse Persistence Service Project :: Map Schema file for ORM/OXM/EIS -->
<xsd:schema
  targetNamespace="http://www.eclipse.org/eclipselink/xsds/persistence"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://www.eclipse.org/eclipselink/xsds/persistence"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"
  version="1.0"
  >
  <xsd:element name="object-persistence" type="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:sequence>
      <xsd:element minOccurs="0" name="name" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>A name for the model being mapped.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="class-mapping-descriptors">
        <xsd:annotation>
          <xsd:documentation>The list of class mapping descriptors.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="class-mapping-descriptor" type="class-mapping-descriptor">
              <xsd:annotation>
                <xsd:documentation>Information of how a class is persisted to its data-store.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" name="login" type="datasource-login">
        <xsd:annotation>
          <xsd:documentation>The datasource connection and configuration information.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="default-temporal-mutable" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Defines the default for how Date and Calendar types are used with change tracking.</xsd:documentation>
          <xsd:documentation>By default they are assumed not to be changed directly (only replaced).</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute default="Eclipse Persistence Services - 1.0 (Build YYMMDD)" name="version" type="xsd:string" />
  </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 minOccurs="0" name="platform-class" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The fully qualified name of the platform class.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="user-name" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The datasource user-name.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="password" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The datasource password, this is stored in encrypted form.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="external-connection-pooling" type="xsd:boolean">
        <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 minOccurs="0" default="false" name="external-transaction-controller" type="xsd:boolean">
        <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 minOccurs="0" name="sequencing">
        <xsd:annotation>
          <xsd:documentation>Sequencing information.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" name="default-sequence" type="sequence">
              <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 minOccurs="0" name="sequences">
              <xsd:annotation>
                <xsd:documentation>Non default sequences. Make sure each sequence has unique name.</xsd:documentation>
              </xsd:annotation>
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element minOccurs="0" maxOccurs="unbounded" name="sequence" type="sequence" />
                </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 mixed="false">
      <xsd:extension base="datasource-login">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="driver-class" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The fully qualified name of the JDBC driver class.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="connection-url" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The full JDBC driver connection URL.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="true" name="bind-all-parameters" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Configure if parameter binding should be used.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="cache-all-statements" type="xsd:boolean">
            <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 minOccurs="0" default="true" name="byte-array-binding" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Configure if byte array data-types should use binding.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="string-binding" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Configure if string data-types should use binding.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="256" name="string-binding-size" type="xsd:integer">
            <xsd:annotation>
              <xsd:documentation>Configure the threshold string size for usage of string binding.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="streams-for-binding" type="xsd:boolean">
            <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 minOccurs="0" default="false" name="force-field-names-to-upper-case" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Configure to force all field names to upper-case.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="true" name="optimize-data-conversion" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Configure data optimization.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="true" name="trim-strings" type="xsd:boolean">
            <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 minOccurs="0" default="false" name="batch-writing" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Configure if batch writing should be used.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="true" name="jdbc-batch-writing" type="xsd:boolean">
            <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 mixed="false">
      <xsd:extension base="datasource-login">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="connection-spec-class" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The fully qualified name of the TopLink platform specific connection spec class.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="connection-factory-url" type="xsd:string">
            <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="xml-login">
    <xsd:annotation>
      <xsd:documentation>The connection and configuration information.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="datasource-login">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="true" name="equal-namespace-resolvers" type="xsd:boolean" />
        </xsd:sequence>
      </xsd:extension>
    </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:documentation>This is an abstract definition to allow flexibility in the types of classes and datastores persisted, i.e. interfaces, abstract classes, aggregates, non-relational persistence.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="class" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The name of the implementation class being persisted.  The class name must be full qualified with its package.</xsd:documentation>
          <xsd:documentation>Example: <class xmlns="http://www.eclipse.org/eclipselink/xsds/persistence">example.employee.implementation.Employee</class></xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="alias" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Optionally an alias name can be given for the class.  The alias is a string that can be used to refer to the class in place of its implementation name, such as in querying.</xsd:documentation>
          <xsd:documentation>Example: <alias xmlns="http://www.eclipse.org/eclipselink/xsds/persistence">Employee</alias></xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="primary-key">
        <xsd:annotation>
          <xsd:documentation>The list of fields/columns that make up the primary key or unique identifier of the class.</xsd:documentation>
          <xsd:documentation>This is used for caching, relationships, and for database operations.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="unbounded" name="field" type="field">
              <xsd:annotation>
                <xsd:documentation>The primary key field.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="read-only" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Defines if the class is read-only.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="properties">
        <xsd:annotation>
          <xsd:documentation>Allow for user defined properties to be defined.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="property" type="property">
              <xsd:annotation>
                <xsd:documentation>A user defined property.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" name="inheritance" type="inheritance-policy">
        <xsd:annotation>
          <xsd:documentation>Defines how the class is related in inheritance and how this inheritance is persisted.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="events" type="event-policy">
        <xsd:annotation>
          <xsd:documentation>Defines the persistent events for this class.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="querying" type="query-policy">
        <xsd:annotation>
          <xsd:documentation>The list of defined queries for the class.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="attribute-mappings">
        <xsd:annotation>
          <xsd:documentation>The list of mappings that define how the class' attributes are persisted.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="attribute-mapping" type="attribute-mapping">
              <xsd:annotation>
                <xsd:documentation>Defines how a attribute is persisted. The attribute mapping definition is extendable to allow for different types of mappings.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" name="descriptor-type" type="class-descriptor-type">
        <xsd:annotation>
          <xsd:documentation>Defines the descriptor type, such as aggregate or independent.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="interfaces" type="interface-policy">
        <xsd:annotation>
          <xsd:documentation>Defines the interfaces that this class implements..</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="locking" type="locking-policy">
        <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 minOccurs="0" name="sequencing" type="sequencing-policy">
        <xsd:annotation>
          <xsd:documentation>Defines how a generated unique id should be assigned to the class.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="caching" type="caching-policy">
        <xsd:annotation>
          <xsd:documentation>Defines how the class' instances should be cached.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="remote-caching" type="caching-policy">
        <xsd:annotation>
          <xsd:documentation>Defines how the class' instances should be cached on remote clients.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="history-policy" type="history-policy">
        <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 minOccurs="0" name="returning-policy" type="returning-policy">
        <xsd:annotation>
          <xsd:documentation>Defines retuning policy.  By default there will be no returning policy.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="amendment" type="amendment">
        <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 minOccurs="0" name="instantiation" type="instantiation-policy">
        <xsd:annotation>
          <xsd:documentation>Allow the object instantiation behavoir to be customized</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="copying" type="copy-policy">
        <xsd:annotation>
          <xsd:documentation>Allow the object cloning/copying behavoir to be customized.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="query-keys">
        <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 minOccurs="0" maxOccurs="unbounded" name="query-key" type="query-key">
              <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 minOccurs="0" name="cmp-policy" type="cmp-policy">
        <xsd:annotation>
          <xsd:documentation>Place holder of CMP information specific.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="fetch-groups" type="fetch-groups">
        <xsd:annotation>
          <xsd:documentation>Contains all pre-defined fetch groups at the descriptor level</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" maxOccurs="1" name="change-policy" type="change-policy">
        <xsd:annotation>
          <xsd:documentation>Contains the Change Policy for this descriptor</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute fixed="10" name="schema-major-version" type="xsd:integer" />
    <xsd:attribute fixed="0" name="schema-minor-version" type="xsd:integer" />
  </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 minOccurs="0" maxOccurs="unbounded" name="interface" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The fully qualified interface class name.</xsd:documentation>
          <xsd:documentation>Example: <class xmlns="http://www.eclipse.org/eclipselink/xsds/persistence">example.employee.api.Employee</class></xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="implementor-descriptor" type="xsd:string">
        <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 xmlns="http://www.eclipse.org/eclipselink/xsds/persistence">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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="copy-policy">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="method" type="xsd:string">
            <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 minOccurs="0" name="method" type="xsd:string">
        <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 minOccurs="0" name="factory-class" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The fully qualified factory class name.'</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="factory-method" type="xsd:string">
        <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 mixed="false">
      <xsd:extension base="class-mapping-descriptor">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="tables">
            <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 maxOccurs="unbounded" name="table" type="table">
                  <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 minOccurs="0" name="foreign-keys-for-multiple-table" type="foreign-key">
            <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 minOccurs="0" name="multiple-table-join-criteria" type="criteria">
            <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 mixed="false">
      <xsd:extension base="locking-policy">
        <xsd:sequence>
          <xsd:element name="version-field" type="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 minOccurs="0" default="true" name="store-version-in-cache" type="xsd:boolean">
            <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 mixed="false">
      <xsd:extension base="version-locking-policy">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="false" name="server-time" type="xsd:boolean">
            <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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 maxOccurs="unbounded" name="field" type="field" />
              </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="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-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 minOccurs="0" default="soft-cache-weak-reference" name="cache-type" type="cache-type">
        <xsd:annotation>
          <xsd:documentation>Specify the type of caching, such as LRU, weak reference or none.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="100" name="cache-size" type="xsd:integer">
        <xsd:annotation>
          <xsd:documentation>Specify the initial or maximum size of the cache.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="always-refresh" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Specify to always refresh cached objects on queries.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="only-refresh-cache-if-newer-version" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Specify to refresh if the cached object is an older version.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="disable-cache-hits" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Disable obtaining cache hits on primary key queries.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="always-conform" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Specify to always conform queries within a transaction.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="isolated" type="xsd:boolean">
        <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 minOccurs="0" default="isolate-new-data-after-transaction" name="unitofwork-isolation-level" type="unitofwork-isolation-level">
        <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 minOccurs="0" name="cache-invalidation-policy" type="cache-invalidation">
        <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 minOccurs="0" default="change-set" name="cache-sync-type" type="cache-sync-type">
        <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 minOccurs="0" default="false" name="update-read-time-on-update" type="xsd:boolean" />
    </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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 minOccurs="0" default="true" name="handle-writes" type="xsd:boolean" />
      <xsd:element minOccurs="0" default="false" name="use-database-time" type="xsd:boolean" />
      <xsd:element minOccurs="0" name="history-tables">
        <xsd:annotation>
          <xsd:documentation>Defines the names of the mirroring historical tables.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="unbounded" name="history-table" type="history-table" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" name="start-fields">
        <xsd:annotation>
          <xsd:documentation>Defines the start fields for each historical table.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="unbounded" name="start-field" type="field" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" name="end-fields">
        <xsd:annotation>
          <xsd:documentation>Defines the end fields for each historical table.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element maxOccurs="unbounded" name="end-field" type="field" />
          </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 minOccurs="0" default="" name="source" type="xsd:string" />
      <xsd:element minOccurs="1" name="history" type="xsd:string" />
    </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 minOccurs="1" name="returning-field-infos">
        <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 maxOccurs="unbounded" name="returning-field-info" type="returning-field-info" />
          </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 minOccurs="0" 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:element name="field" type="field">
        <xsd:annotation>
          <xsd:documentation>The field to be returned.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="insert" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Indicates whether the field should be retuned after Insert.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="insert-mode-return-only" type="xsd:boolean">
        <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 minOccurs="0" default="false" name="update" type="xsd:boolean">
        <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 the class is related in inheritance and how this inheritance is persisted.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element minOccurs="0" name="parent-class" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The name of the parent/superclass of the class being persisted.  The class name must be full qualified   with its package.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="true" name="read-subclasses-on-queries" type="xsd:boolean">
        <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 minOccurs="0" name="all-subclasses-view" type="xsd:string">
        <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 minOccurs="0" default="false" name="use-class-name-as-indicator" type="xsd:boolean">
        <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 minOccurs="0" name="class-extraction-method" type="xsd:string">
        <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 minOccurs="0" name="class-indicator-field" type="field">
        <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 minOccurs="0" name="class-indicator-mappings" type="class-indicator-mappings">
        <xsd:annotation>
          <xsd:documentation>The set of class indicator values and the subclasses they map to.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="class-extractor" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The name of a class that implements a class extractor interface.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="only-instances-criteria" type="criteria">
        <xsd:annotation>
          <xsd:documentation>The criteria that filters out all sibling and subclass instances on queries.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="all-subclasses-criteria" type="criteria">
        <xsd:annotation>
          <xsd:documentation>The criteria that filters out sibling instances on queries.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="outer-join-subclasses" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>For inheritance queries specify if all subclasses should be outer joined, instead of a query per subclass.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
    </xsd:sequence>
  </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 mixed="false">
      <xsd:extension base="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 minOccurs="0" maxOccurs="unbounded" name="class-indicator-mapping">
        <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:sequence>
      <xsd:element minOccurs="0" name="event-listeners">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="event-listener" type="xsd:string">
              <xsd:annotation>
                <xsd:documentation>The fully qualified name of an event listener class that implements the descriptor event listener interface.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-build-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after building the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="pre-write-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed before writing the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-write-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after writing the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="pre-insert-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed before inserting the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-insert-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after inserting the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="pre-update-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed before updating the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-update-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after updating the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="pre-delete-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed before deleting the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-delete-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after deleting the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="about-to-insert-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed before inserting the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="about-to-update-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed before updating the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-clone-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after cloning the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-merge-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after merging the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="post-refresh-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Method executed after refreshing the object.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
    </xsd:sequence>
  </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:sequence>
      <xsd:element minOccurs="0" name="queries">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="query" type="query">
              <xsd:annotation>
                <xsd:documentation>A query definition for the class' instances.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" name="timeout" type="xsd:integer">
        <xsd:annotation>
          <xsd:documentation>Specifies a timeout to apply to all queries.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="check-cache" name="existence" type="existence-policy">
        <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 minOccurs="0" name="insert-query" type="insert-object-query">
        <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 minOccurs="0" name="update-query" type="update-object-query">
        <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 minOccurs="0" name="delete-query" type="delete-object-query">
        <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 minOccurs="0" name="does-exist-query" type="does-exist-query">
        <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 minOccurs="0" name="read-object-query" type="read-object-query">
        <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 minOccurs="0" name="read-all-query" type="read-all-query">
        <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: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 mixed="false">
      <xsd:extension base="query-key">
        <xsd:sequence>
          <xsd:element name="field" type="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 mixed="false">
      <xsd:extension base="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="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="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 mixed="false">
      <xsd:extension base="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="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="attribute-mapping">
        <xsd:sequence>
          <xsd:element name="field" type="field">
            <xsd:annotation>
              <xsd:documentation>The name and optionally the table of the field/column that the attribute is stored into.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="null-value" type="xsd:anySimpleType" minOccurs="0">
            <xsd:annotation>
              <xsd:documentation>Optionally specify a value that null data values should be converted to.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="converter" type="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="attribute-classification" type="xsd:string" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="attribute-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines how a attribute is persisted. The attribute mapping definition is extendable to allow for different types of mappings.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element minOccurs="0" name="attribute-name" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The name of the attribute.  This is the implementation class attribute name.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="false" name="read-only" type="xsd:boolean">
        <xsd:annotation>
          <xsd:documentation>Specify if the attribute is read-only.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="get-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The name of the get method for the attribute.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="set-method" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The name of the set method for the attribute.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="properties">
        <xsd:annotation>
          <xsd:documentation>Allow for user defined properties to be defined.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="property" type="property">
              <xsd:annotation>
                <xsd:documentation>A user defined property.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="direct-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines how a simple attribute is persisted.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent>
      <xsd:extension base="abstract-direct-mapping">
      </xsd:extension>
    </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="abstract-direct-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="is-cdata" type="xsd:boolean" />
          <xsd:element minOccurs="0" name="null-policy" type="abstract-null-policy" />
        </xsd:sequence>
      </xsd:extension>
    </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 mixed="false">
      <xsd:extension base="abstract-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="field" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="method-based-field-transformation">
    <xsd:complexContent mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="attribute-method" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The name of the attribute transformation defined in the domain class.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="attribute-transformer" type="xsd:string">
            <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 minOccurs="0" default="true" name="mutable" type="xsd:boolean" />
          <xsd:element minOccurs="0" name="indirection" type="indirection-policy" />
          <xsd:element minOccurs="0" name="field-transformations">
            <xsd:annotation>
              <xsd:documentation>The field transformations.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="field-transformation" type="field-transformation" />
              </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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 minOccurs="0" default="true" name="allow-null" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if a row of all nulls should be interpreted as null.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="field-translations">
            <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 minOccurs="0" maxOccurs="unbounded" name="field-translation">
                  <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="source-field" type="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="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="relationship-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines how a relationship between two classes is persisted.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="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 minOccurs="0" default="false" name="private-owned" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the target objects are privately owned dependent objects.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="cascade-persist" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the create operation should be cascaded to the referenced object.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="cascade-merge" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the create operation should be cascaded to the referenced object.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="cascade-refresh" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the refresh operation should be cascaded to the referenced object.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="cascade-remove" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the remove operation should be cascaded to the referenced object.</xsd:documentation>
            </xsd:annotation>
          </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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="foreign-key" type="foreign-key">
            <xsd:annotation>
              <xsd:documentation>The foreign key in the source class' table that defines the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="foreign-key-fields">
            <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 minOccurs="0" maxOccurs="unbounded" name="field" type="field">
                  <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 minOccurs="0" name="bidirectional-target-attribute" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="batch-reading" type="xsd:boolean">
            <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 minOccurs="0" name="indirection" type="indirection-policy">
            <xsd:annotation>
              <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="selection-query" type="read-object-query">
            <xsd:annotation>
              <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="none" name="join-fetch" type="join-fetch-type">
            <xsd:annotation>
              <xsd:documentation>Specify to always join the related 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 mixed="false">
      <xsd:extension base="one-to-one-mapping" />
    </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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element name="target-foreign-key" type="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 minOccurs="0" name="bidirectional-target-attribute" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="batch-reading" type="xsd:boolean">
            <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 minOccurs="0" name="container" type="container-policy">
            <xsd:annotation>
              <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="indirection" type="indirection-policy">
            <xsd:annotation>
              <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="selection-query" type="read-all-query">
            <xsd:annotation>
              <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="delete-all-query" type="delete-all-query">
            <xsd:annotation>
              <xsd:documentation>A query to delete all of the related objects can be specified.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="none" name="join-fetch" type="join-fetch-type">
            <xsd:annotation>
              <xsd:documentation>Specify to always join the related objects.</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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="source-foreign-key-fields">
            <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 minOccurs="0" maxOccurs="unbounded" name="field" type="field">
                  <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 minOccurs="0" name="target-foreign-key-fields">
            <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 minOccurs="0" maxOccurs="unbounded" name="field" type="field">
                  <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 minOccurs="0" name="foreign-key-grouping-element" type="field" />
          <xsd:element minOccurs="0" name="bidirectional-target-attribute" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="container" type="container-policy">
            <xsd:annotation>
              <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="indirection" type="indirection-policy">
            <xsd:annotation>
              <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="selection-query" type="read-all-query">
            <xsd:annotation>
              <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="delete-all-query" type="delete-all-query">
            <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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="false" name="batch-reading" type="xsd:boolean">
            <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 minOccurs="0" name="container" type="container-policy">
            <xsd:annotation>
              <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="indirection" type="indirection-policy">
            <xsd:annotation>
              <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="selection-query" type="data-read-query">
            <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="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="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 minOccurs="0" name="value-converter" type="value-converter">
            <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 minOccurs="0" name="insert-query" type="data-modify-query">
            <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 minOccurs="0" name="delete-query" type="data-modify-query">
            <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 minOccurs="0" name="delete-all-query" type="data-modify-query">
            <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 minOccurs="0" name="session-name" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The name session that defines the reference table.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="history-policy" type="history-policy">
            <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:element minOccurs="0" default="none" name="join-fetch" type="join-fetch-type">
            <xsd:annotation>
              <xsd:documentation>Specify to always join the related objects.</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 mixed="false">
      <xsd:extension base="direct-collection-mapping">
        <xsd:sequence>
          <xsd:element name="direct-key-field" type="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 minOccurs="0" name="key-converter" type="value-converter">
            <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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element name="target-foreign-key" type="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 minOccurs="0" name="bidirectional-target-attribute" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="batch-reading" type="xsd:boolean">
            <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 minOccurs="0" name="container" type="container-policy">
            <xsd:annotation>
              <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="indirection" type="indirection-policy">
            <xsd:annotation>
              <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="selection-query" type="read-all-query">
            <xsd:annotation>
              <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="delete-all-query" type="delete-all-query">
            <xsd:annotation>
              <xsd:documentation>A query to delete all of the related objects can be specified.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="none" name="join-fetch" type="join-fetch-type">
            <xsd:annotation>
              <xsd:documentation>Specify to always join the related objects.</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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element name="relation-table" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The name of the relation table that stores the source/target primary keys.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="source-relation-foreign-key" type="foreign-key">
            <xsd:annotation>
              <xsd:documentation>The foreign key from the relational table to the source class' table.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="target-relation-foreign-key" type="foreign-key">
            <xsd:annotation>
              <xsd:documentation>The foreign key from the relational table to the target class' table.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="bidirectional-target-attribute" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="batch-reading" type="xsd:boolean">
            <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 minOccurs="0" name="container" type="container-policy">
            <xsd:annotation>
              <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="indirection" type="indirection-policy">
            <xsd:annotation>
              <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="selection-query" type="read-all-query">
            <xsd:annotation>
              <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="insert-query" type="data-modify-query">
            <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 minOccurs="0" name="delete-query" type="data-modify-query">
            <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 minOccurs="0" name="delete-all-query" type="data-modify-query">
            <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 minOccurs="0" name="history-policy" type="history-policy">
            <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:element minOccurs="0" default="none" name="join-fetch" type="join-fetch-type">
            <xsd:annotation>
              <xsd:documentation>Specify to always join the related objects.</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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="bidirectional-target-attribute" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>For bi-directional relationships the target inverse relationship can be defined.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="batch-reading" type="xsd:boolean">
            <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 minOccurs="0" name="indirection" type="indirection-policy">
            <xsd:annotation>
              <xsd:documentation>The indirection policy to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="selection-query" type="read-object-query">
            <xsd:annotation>
              <xsd:documentation>Specify the query to use to select the target objects.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="type-field" type="field">
            <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 minOccurs="0" name="foreign-key-fields">
            <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 minOccurs="0" maxOccurs="unbounded" name="field" type="field">
                  <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 maxOccurs="unbounded" name="query-key-reference">
                  <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="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 minOccurs="0" name="class-indicator-mappings" type="class-indicator-mappings">
            <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 minOccurs="0" name="collection-type" type="xsd:string">
        <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="sorted-collection-container-policy">
    <xsd:annotation>
      <xsd:documentation>Defines a sorted collection type.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="container-policy">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="comparator-class" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Specifies the fully qualified class name of the comparitor, used to compare objects in sorting the collection.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="list-container-policy">
    <xsd:annotation>
      <xsd:documentation>Defines a list collection type.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="container-policy">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="map-key-method" type="xsd:string">
            <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 mixed="false">
      <xsd:extension base="container-policy" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="scrollable-cursor-policy">
    <xsd:annotation>
      <xsd:documentation>Defines a scrollable cursor container type.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="container-policy" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="cursored-stream-policy">
    <xsd:annotation>
      <xsd:documentation>Defines a cursored stream container type.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="indirection-policy">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="collection-type" type="xsd:string">
            <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 minOccurs="0" name="map-key-method" type="xsd:string">
            <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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="value-converter">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="object-class" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Specifies the fully qualified class name of the attribute type.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="data-class" type="xsd:string">
            <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 mixed="false">
      <xsd:extension base="value-converter">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="data-type" type="xsd:string">
            <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 mixed="false">
      <xsd:extension base="value-converter">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="default-value" type="xsd:anySimpleType">
            <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 maxOccurs="unbounded" name="type-mapping" type="type-mapping">
                  <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 minOccurs="0" name="attribute-only-type-mappings">
            <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 maxOccurs="unbounded" name="type-mapping" type="type-mapping">
                  <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 mixed="false">
      <xsd:extension base="query">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="true" name="maintain-cache" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specifies if the query should bypass the cache completely.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="bind-all-parameters" type="xsd:boolean">
            <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 minOccurs="0" name="cache-statement" type="xsd:boolean">
            <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 minOccurs="0" name="timeout" type="xsd:integer">
            <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 minOccurs="0" default="true" name="prepare" type="xsd:boolean">
            <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 minOccurs="0" name="call" type="criteria">
            <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="join-fetch-type">
    <xsd:annotation>
      <xsd:documentation>Defines the set of valid join fetch options.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="none" />
      <xsd:enumeration value="inner-join" />
      <xsd:enumeration value="outer-join" />
    </xsd:restriction>
  </xsd:simpleType>
  <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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="read-query">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="container" type="container-policy">
            <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 mixed="false">
      <xsd:extension base="database-query">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="false" name="cache-query-results" type="xsd:boolean">
            <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 minOccurs="0" name="max-rows" type="xsd:integer">
            <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 minOccurs="0" name="first-result" type="xsd:integer">
            <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 minOccurs="0" name="fetch-size" type="xsd:integer">
            <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 minOccurs="0" name="query-result-cache-policy" type="query-result-cache-policy">
            <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 minOccurs="0" name="invalidation-policy" type="cache-invalidation">
        <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 minOccurs="0" default="100" name="maximum-cached-results" type="xsd:integer">
        <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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="database-query">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="existence-check" type="existence-check">
            <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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="read-query">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="reference-class" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The full qualified name of the class of objects being queried.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="refresh" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the query should refresh any cached objects from the database.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="remote-refresh" type="xsd:boolean">
            <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 minOccurs="0" default="none" name="cascade-policy" type="cascade-policy">
            <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 minOccurs="0" default="primary-key" name="cache-usage" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Specify how the query should interact with the cache.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="none" name="lock-mode" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Specify if the query should lock the resulting rows on the database.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="none" name="distinct-state" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Specify if the query should filter distinct results.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="in-memory-querying">
            <xsd:annotation>
              <xsd:documentation>The in memory querying policy.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element default="ignore-exceptions-return-conformed" name="policy" type="xsd:string">
                  <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 minOccurs="0" default="true" name="use-default-fetch-group" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the default fetch group should be used for the query.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="fetch-group" type="fetch-group">
            <xsd:annotation>
              <xsd:documentation>Allow the query to partially fetch the object.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="fetch-group-name" type="xsd:string">
            <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 minOccurs="0" default="false" name="use-exclusive-connection" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if the exclusive connection (VPD) should be used for the query.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="joined-attribute-expressions">
            <xsd:annotation>
              <xsd:documentation>Specifies the attributes being joined.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="expression" type="expression">
                  <xsd:annotation>
                    <xsd:documentation>Represents an expression for joining</xsd:documentation>
                  </xsd:annotation>
                </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="read-only" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Specify if objects resulting from the query are read-only, and will not be registered in the unit of work.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="false" name="outer-join-subclasses" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>For inheritance queries specify if all subclasses should be outer joined, instead of a query per subclass.</xsd:documentation>
            </xsd:annotation>
          </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 mixed="false">
      <xsd:extension base="object-level-read-query">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="container" type="container-policy">
            <xsd:annotation>
              <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="batch-read-attribute-expressions">
            <xsd:annotation>
              <xsd:documentation>Specifies all attributes for batch reading.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="expression" type="expression">
                  <xsd:annotation>
                    <xsd:documentation>Represents an expression for batch reading</xsd:documentation>
                  </xsd:annotation>
                </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element minOccurs="0" name="order-by-expressions">
            <xsd:annotation>
              <xsd:documentation>Sets the order expressions for the query.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="expression" type="expression">
                  <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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="read-all-query">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="return-choice" type="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:element>
          <xsd:element minOccurs="0" name="retrieve-primary-keys" type="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:element>
          <xsd:element minOccurs="0" name="report-items">
            <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 minOccurs="0" maxOccurs="unbounded" name="item" type="report-item">
                  <xsd:annotation>
                    <xsd:documentation>Represents an item requested</xsd:documentation>
                  </xsd:annotation>
                </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element minOccurs="0" name="group-by-expressions">
            <xsd:annotation>
              <xsd:documentation>Sets GROUP BY expressions for the query.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="expression" type="expression">
                  <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="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="expression">
        <xsd:sequence>
          <xsd:element name="left" type="expression" />
          <xsd:element name="right" type="expression" />
        </xsd:sequence>
        <xsd:attribute name="operator" type="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 mixed="false">
      <xsd:extension base="expression">
        <xsd:sequence>
          <xsd:element name="left" type="expression" />
          <xsd:element name="right" type="expression" />
        </xsd:sequence>
        <xsd:attribute name="operator" type="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 mixed="false">
      <xsd:extension base="expression">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="arguments">
            <xsd:annotation>
              <xsd:documentation>The list of function arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="expression">
                  <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="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 mixed="false">
      <xsd:extension base="expression">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="value" type="xsd:anySimpleType" />
        </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 mixed="false">
      <xsd:extension base="expression">
        <xsd:sequence>
          <xsd:element name="base" type="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 mixed="false">
      <xsd:extension base="expression">
        <xsd:sequence>
          <xsd:element name="field" type="field" />
          <xsd:element name="base" type="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 mixed="false">
      <xsd:extension base="expression">
        <xsd:sequence>
          <xsd:element name="parameter" type="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 mixed="false">
      <xsd:extension base="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:simpleType>
  <xsd:complexType name="sql-call">
    <xsd:annotation>
      <xsd:documentation>Defines an SQL query language string.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 minOccurs="0" name="cursor-output-procedure" type="xsd:boolean">
            <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 minOccurs="0" name="arguments">
            <xsd:annotation>
              <xsd:documentation>The list of input and output arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="procedure-argument">
                  <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="stored-function-call">
    <xsd:annotation>
      <xsd:documentation>Defines a stored function invocation definition.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="stored-procedure-call">
        <xsd:sequence>
          <xsd:element minOccurs="1" name="stored-function-result" type="procedure-output-argument">
            <xsd:annotation>
              <xsd:documentation>The return value of the stored-function.</xsd:documentation>
            </xsd:annotation>
          </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 minOccurs="0" name="procedure-argument-name" type="xsd:string">
        <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 minOccurs="0" name="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:element minOccurs="0" name="procedure-argument-type" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The fully qualified name of the argument class type.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="procedure-argument-sqltype" type="xsd:int">
        <xsd:annotation>
          <xsd:documentation>The JDBC int type of the argument, as defined in java.jdbc.Types</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="procedure-argument-sqltype-name" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The name of the type if procedure-argument-sqltype is STRUCT or ARRAY</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="argument-value" type="xsd:anySimpleType">
        <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 mixed="false">
      <xsd:extension base="procedure-argument" />
    </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 mixed="false">
      <xsd:extension base="procedure-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="plsql-stored-procedure-call">
    <xsd:annotation>
      <xsd:documentation>Defines a stored procedure invocation definition whose arguments contain at least one Oracle PL/SQL type that has no JDBC representation (e.g. BOOLEAN, PLS_INTEGER, PL/SQL record).</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="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 minOccurs="0" name="arguments">
            <xsd:annotation>
              <xsd:documentation>The list of input and output arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="plsql-procedure-argument-type">
                  <xsd:annotation>
                    <xsd:documentation>Defines an argument to the procedure.</xsd:documentation>
                  </xsd:annotation>
                </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="plsql-procedure-argument-type" abstract="true">
    <xsd:sequence>
      <xsd:element name="name" type="xsd:string" />
      <xsd:element minOccurs="0" name="index" type="xsd:string" />
      <xsd:element minOccurs="0" name="direction" type="xsd:string" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="jdbc-type">
    <xsd:complexContent mixed="false">
      <xsd:extension base="plsql-procedure-argument-type">
        <xsd:sequence>
          <xsd:choice>
            <xsd:element minOccurs="0" name="length" type="xsd:string" />
            <xsd:sequence>
              <xsd:element name="precision" type="xsd:string" />
              <xsd:element name="scale" type="xsd:string" />
            </xsd:sequence>
          </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="type-name" type="xsd:string" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="plsql-type">
    <xsd:complexContent mixed="false">
      <xsd:extension base="plsql-procedure-argument-type">
        <xsd:attribute name="type-name" type="xsd:string" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="plsql-record">
    <xsd:complexContent mixed="false">
      <xsd:extension base="plsql-procedure-argument-type">
        <xsd:sequence>
          <xsd:element name="record-name" type="xsd:string" />
          <xsd:element name="type-name" type="xsd:string" />
          <xsd:element minOccurs="0" name="compatible-type" type="xsd:string" />
          <xsd:element minOccurs="0" name="fields">
            <xsd:annotation>
              <xsd:documentation>The list of fields.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="field" type="plsql-procedure-argument-type">
                  <xsd:annotation>
                    <xsd:documentation>Defines an argument to the procedure.</xsd:documentation>
                  </xsd:annotation>
                </xsd:element>
              </xsd:sequence>
            </xsd:complexType>
          </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 mixed="false">
      <xsd:extension base="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 minOccurs="0" name="namespace-resolver" type="namespace-resolver">
            <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 mixed="false">
      <xsd:extension base="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 minOccurs="0" name="input-result-path" type="xsd:string">
            <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 minOccurs="0" name="output-result-path" type="xsd:string">
            <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 minOccurs="0" name="input-arguments">
            <xsd:annotation>
              <xsd:documentation>The list of input arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="interaction-argument" />
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element minOccurs="0" name="output-arguments">
            <xsd:annotation>
              <xsd:documentation>The list of output arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="interaction-argument" />
              </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 mixed="false">
      <xsd:extension base="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 minOccurs="0" name="input-record-name" type="xsd:string">
            <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 minOccurs="0" name="input-root-element-name" type="xsd:string">
            <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 minOccurs="0" name="input-result-path" type="xsd:string">
            <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 minOccurs="0" name="output-result-path" type="xsd:string">
            <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 minOccurs="0" name="input-arguments">
            <xsd:annotation>
              <xsd:documentation>The list of input arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="interaction-argument" />
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element minOccurs="0" name="output-arguments">
            <xsd:annotation>
              <xsd:documentation>The list of output arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="interaction-argument" />
              </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 mixed="false">
      <xsd:extension base="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 minOccurs="0" name="input-arguments">
            <xsd:annotation>
              <xsd:documentation>The list of input arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="interaction-argument" />
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
          <xsd:element minOccurs="0" name="output-arguments">
            <xsd:annotation>
              <xsd:documentation>The list of output arguments.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="interaction-argument" />
              </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 minOccurs="0" name="argument-value" type="xsd:anySimpleType">
        <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 mixed="false">
      <xsd:extension base="relational-class-mapping-descriptor">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="structure" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The name of the object structure type.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="field-order">
            <xsd:annotation>
              <xsd:documentation>The ordered list of the field defined in the structure.</xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element maxOccurs="unbounded" name="field" type="field" />
              </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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element name="field" type="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 mixed="false">
      <xsd:extension base="abstract-composite-direct-collection-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="structure" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Specify the object-relational type name of the structure 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 mixed="false">
      <xsd:extension base="abstract-composite-collection-mapping">
        <xsd:sequence>
          <xsd:element name="structure" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Specify the object-relational type name of the structure type.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="structure-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a structure of object-types using the object-relational structure type.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="abstract-composite-object-mapping" />
    </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 mixed="false">
      <xsd:extension base="relationship-mapping">
        <xsd:sequence>
          <xsd:element name="field" type="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="object-relational-field">
    <xsd:annotation>
      <xsd:documentation>Defines an ObjectRelationalDatabaseField</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="field">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="nested-type-field" type="field" />
        </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 mixed="false">
      <xsd:extension base="direct-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="read-whole-document" type="xsd:boolean" />
        </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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element name="field" type="field" />
          <xsd:element minOccurs="0" name="value-converter" type="value-converter">
            <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 minOccurs="0" name="value-converter-class" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Optionally specify a user defined converter class.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="container" type="container-policy">
            <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-collection-reference-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a 1-M relationship from the source XML element to the target XML element based on a key.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="xml-object-reference-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="containerpolicy" type="container-policy">
            <xsd:annotation>
              <xsd:documentation>Defines the collection type to use for the relationship.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element name="uses-single-node" type="xsd:boolean" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-object-reference-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a 1-1 relationship from the source XML element to the target XML element based on one or more keys.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="aggregate-object-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="source-to-target-key-field-association" type="foreign-key" />
          <xsd:element minOccurs="0" name="source-to-target-key-fields">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="field" type="field" />
              </xsd:sequence>
            </xsd:complexType>
          </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 mixed="false">
      <xsd:extension base="abstract-composite-direct-collection-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="is-cdata" type="xsd:boolean" />
        </xsd:sequence>
      </xsd:extension>
    </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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="reference-class" type="xsd:string" />
          <xsd:element name="field" type="field" />
          <xsd:element minOccurs="0" name="container" type="container-policy">
            <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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="reference-class" type="xsd:string" />
          <xsd:element name="field" type="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 mixed="false">
      <xsd:extension base="abstract-composite-object-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="null-policy" type="abstract-null-policy" />
        </xsd:sequence>
      </xsd:extension>
    </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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="class-mapping-descriptor">
        <xsd:sequence>
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="default-root-element" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The name of the element the descriptor maps to.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="default-root-element-field" type="node">
            <xsd:annotation>
              <xsd:documentation>The XMLField representing the default root element of the descriptor.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="should-preserve-document" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>Indicates if nodes should be cached to preserve unmapped data</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="namespace-resolver" type="namespace-resolver">
            <xsd:annotation>
              <xsd:documentation>The namespace resolver for the descriptor.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="schema" type="schema-reference">
            <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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="field" type="field" />
          <xsd:element minOccurs="0" name="container" type="container-policy" />
          <xsd:element minOccurs="0" default="false" name="use-xml-root" type="xsd:boolean" />
          <xsd:element minOccurs="0" name="keep-as-element-policy" type="xsd:string" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-any-attribute-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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="field" type="field" />
          <xsd:element minOccurs="0" name="container" type="container-policy" />
        </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 mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="field" type="field" />
          <xsd:element minOccurs="0" default="false" name="use-xml-root" type="xsd:boolean" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-fragment-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a mapping of a single Node to a fragment of an XML document</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="xml-direct-mapping" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-fragment-collection-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a mapping of a collection of Nodes to a fragment of an XML document</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="abstract-composite-collection-mapping" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-binary-data-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a mapping of a binary object to base64 binary</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="xml-direct-mapping">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="is-swa-ref" type="xsd:boolean" />
          <xsd:element minOccurs="0" name="mime-type" type="xsd:string" />
          <xsd:element minOccurs="0" name="should-inline-data" type="xsd:boolean" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-choice-collection-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a mapping of a collection to a choice structure in an xml document</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element name="container-policy" type="container-policy" />
          <xsd:element maxOccurs="unbounded" name="field-to-class-association" type="xml-choice-field-to-class-association" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-choice-object-mapping">
    <xsd:annotation>
      <xsd:documentation>Defines a mapping of a collection to a choice structure in an xml document</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="attribute-mapping">
        <xsd:sequence>
          <xsd:element maxOccurs="unbounded" name="field-to-class-association" type="xml-choice-field-to-class-association" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-choice-field-to-class-association">
    <xsd:sequence>
      <xsd:element name="xml-field" type="node" />
      <xsd:element name="class-name" type="xsd:string" />
    </xsd:sequence>
  </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 mixed="false">
      <xsd:extension base="field">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="position" type="xsd:integer">
            <xsd:annotation>
              <xsd:documentation>The position of the node in the parent type.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="typed-text-field" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>If this is a typed text field.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="single-node" type="xsd:boolean">
            <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 minOccurs="0" maxOccurs="unbounded" name="schema-type" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The schema type of the element.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="xml-to-java-conversion-pair" type="xml-conversion-pair" />
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="java-to-xml-conversion-pair" type="xml-conversion-pair" />
          <xsd:element minOccurs="0" name="leaf-element-type" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Indicates the elements type.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
        </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 mixed="false">
      <xsd:extension base="field">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="typed-text-field" type="xsd:boolean">
            <xsd:annotation>
              <xsd:documentation>If this is a typed text field.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" name="single-node" type="xsd:boolean">
            <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 minOccurs="0" maxOccurs="unbounded" name="schema-type" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>The schema type of the element.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="xml-to-java-conversion-pair" type="xml-conversion-pair" />
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="java-to-xml-conversion-pair" type="xml-conversion-pair" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="namespace-resolver">
    <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="1" name="namespaces">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="namespace" type="namespace" />
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
      <xsd:element minOccurs="0" maxOccurs="1" name="default-namespace-uri" type="xsd:string" />
    </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 minOccurs="0" 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 mixed="false">
      <xsd:extension base="schema-reference" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="schema-file-reference">
    <xsd:complexContent mixed="false">
      <xsd:extension base="schema-reference" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="schema-url-reference">
    <xsd:complexContent mixed="false">
      <xsd:extension base="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 minOccurs="0" name="pessimistic-locking" type="pessimistic-locking">
        <xsd:annotation>
          <xsd:documentation>Defines the cmp bean-level pessimistic locking policy.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="defer-until-commit" type="defer-until-commit">
        <xsd:annotation>
          <xsd:documentation>Defines modification deferral level for non-deferred writes.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="non-deferred-create-time" type="non-deferred-create-time">
        <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 minOccurs="0" default="wait" name="locking-mode" type="locking-mode" />
    </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 minOccurs="0" default="" name="name" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>Sequence name.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" default="50" name="preallocation-size" type="xsd:integer">
        <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 mixed="false">
      <xsd:extension base="sequence" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="native-sequence">
    <xsd:annotation>
      <xsd:documentation>Database sequence mechanism used.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="sequence" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="table-sequence">
    <xsd:annotation>
      <xsd:documentation>Table sequence</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="sequence">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="SEQUENCE" name="table" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Define the name of the sequence table.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="SEQ_NAME" name="name-field" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Define the name of the sequence name field in the sequence table.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="SEQ_COUNT" name="counter-field" type="xsd:string">
            <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 mixed="false">
      <xsd:extension base="sequence">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="SEQUENCE" name="counter-field" type="xsd:string">
            <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 mixed="false">
      <xsd:extension base="sequence" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="xml-sequence">
    <xsd:annotation>
      <xsd:documentation>Xml sequence</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="sequence">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="SEQUENCE" name="root-element" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Define the name of the sequence table.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="SEQ_NAME" name="name-element" type="xsd:string">
            <xsd:annotation>
              <xsd:documentation>Define the name of the sequence name field in the sequence table.</xsd:documentation>
            </xsd:annotation>
          </xsd:element>
          <xsd:element minOccurs="0" default="SEQ_COUNT" name="counter-element" type="xsd:string">
            <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 minOccurs="0" name="default-fetch-group" type="fetch-group" />
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="fetch-group" type="fetch-group" />
    </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 minOccurs="0" name="name" type="xsd:string" />
      <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 minOccurs="0" maxOccurs="unbounded" name="fetch-group-attribute" type="xsd:string" />
          </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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="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 mixed="false">
      <xsd:extension base="change-policy" />
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="abstract-null-policy">
    <xsd:annotation>
      <xsd:documentation>Defines the Null Policy in use for this relationship currently a choice of [NullPolicy and IsSetNullPolicy].</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element minOccurs="0" default="false" name="xsi-nil-represents-null" type="xsd:boolean" />
      <xsd:element minOccurs="0" default="false" name="empty-node-represents-null" type="xsd:boolean" />
      <xsd:element minOccurs="0" name="null-representation-for-xml" type="marshal-null-representation" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="null-policy">
    <xsd:complexContent mixed="false">
      <xsd:extension base="abstract-null-policy">
        <xsd:sequence>
          <xsd:element minOccurs="0" default="true" name="is-set-performed-for-absent-node" type="xsd:boolean" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="is-set-null-policy">
    <xsd:complexContent mixed="false">
      <xsd:extension base="abstract-null-policy">
        <xsd:sequence>
          <xsd:element minOccurs="0" name="is-set-method-name" type="xsd:string" />
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="is-set-parameter-type" type="xsd:string" />
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="is-set-parameter" type="xsd:string" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:simpleType name="marshal-null-representation">
    <xsd:annotation>
      <xsd:documentation>Write null, no tag(default) or an empty tag.</xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="XSI_NIL" />
      <xsd:enumeration value="ABSENT_NODE" />
      <xsd:enumeration value="EMPTY_NODE" />
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:complexType name="field">
    <xsd:annotation>
      <xsd:documentation>Defines a generic field concept, such as a database column.</xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation>The name of the field.</xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>
  <xsd:complexType name="column">
    <xsd:annotation>
      <xsd:documentation>Defines a column in a relational database table.</xsd:documentation>
    </xsd:annotation>
    <xsd:complexContent mixed="false">
      <xsd:extension base="field">
        <xsd:attribute name="table" type="xsd:string">
          <xsd:annotation>
            <xsd:documentation>The name of the column's table. This table must be listed in the class' tables. If not specified the first table of the class will be used.</xsd:documentation>
          </xsd:annotation>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="foreign-key">
    <xsd:annotation>
      <xsd:documentation>The list of source/target field/column references relating a foreign key in one table to the primary or unique key in another table.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="field-reference">
        <xsd:annotation>
          <xsd:documentation>The reference of a source table foreign key and a target table primary key.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="source-field" type="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-field" type="field">
              <xsd:annotation>
                <xsd:documentation>The primary or unique key field/column name in the target table.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="query">
    <xsd:annotation>
      <xsd:documentation>Defines a query specification for querying instances of the class.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element minOccurs="0" name="criteria" type="criteria">
        <xsd:annotation>
          <xsd:documentation>The selection criteria of the query.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="arguments">
        <xsd:annotation>
          <xsd:documentation>The list of query arguments. The order of the argument must match the order of the argument value passed to the query.</xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="argument" type="query-argument">
              <xsd:annotation>
                <xsd:documentation>The query argument.</xsd:documentation>
              </xsd:annotation>
            </xsd:element>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation>The name of the query.  This name can be used to reference and execute the query.</xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>
  <xsd:complexType name="criteria">
    <xsd:annotation>
      <xsd:documentation>Defines the filtering clause of a query.</xsd:documentation>
    </xsd:annotation>
  </xsd:complexType>
  <xsd:complexType name="query-argument">
    <xsd:annotation>
      <xsd:documentation>Defines a query argument.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element minOccurs="0" name="type" type="xsd:string">
        <xsd:annotation>
          <xsd:documentation>The fully qualified class type name of the argument may be provided.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
      <xsd:element minOccurs="0" name="value" type="xsd:anySimpleType">
        <xsd:annotation>
          <xsd:documentation>Optional constant value for the argument.</xsd:documentation>
        </xsd:annotation>
      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation>The name of the query argument.</xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>
  <xsd:complexType name="property">
    <xsd:annotation>
      <xsd:documentation>A user defined property.</xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="value" type="xsd:anyType" />
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" />
  </xsd:complexType>
  <xsd:complexType name="table">
    <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:attribute name="name" type="xsd:string">
      <xsd:annotation>
        <xsd:documentation>The name of the table.  The name can be fully qualified with the schema, tablespace or link.</xsd:documentation>
      </xsd:annotation>
    </xsd:attribute>
  </xsd:complexType>
  <xsd:complexType name="value-converter">
    <xsd:annotation>
      <xsd:documentation>
        Specifies how the data value should be converted to the
        object value.
      </xsd:documentation>
    </xsd:annotation>
  </xsd:complexType>
</xsd:schema>