Jump to: navigation, search

EclipseLink/DesignDocs/eclipse orm 1 0.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- Java Persistence API object-relational mapping file schema -->
<xsd:schema targetNamespace="http://java.sun.com/xml/ns/persistence/orm" 
  xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified" 
  attributeFormDefault="unqualified" 
  version="1.0">

  <xsd:annotation>
    <xsd:documentation>
      @(#)orm_1_0.xsd 1.0  Feb 14 2006
    </xsd:documentation>
  </xsd:annotation>
  <xsd:annotation>
     <xsd:documentation><![CDATA[

       This is the XML Schema for the persistence object-relational 
       mapping file.
       The file may be named "META-INF/orm.xml" in the persistence 
       archive or it may be named some other name which would be 
       used to locate the file as resource on the classpath.

     ]]></xsd:documentation>
  </xsd:annotation>

  <xsd:complexType name="emptyType"/>

  <xsd:simpleType name="versionType">
    <xsd:restriction base="xsd:token">
      <xsd:pattern value="[0-9]+(\.[0-9]+)*"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:element name="entity-mappings">
    <xsd:complexType>
      <xsd:annotation>
        <xsd:documentation>

        The entity-mappings element is the root element of an mapping
        file. It contains the following four types of elements:

        1. The persistence-unit-metadata element contains metadata
        for the entire persistence unit. It is undefined if this element
        occurs in multiple mapping files within the same persistence unit.
        
        2. The package, schema, catalog and access elements apply to all of
        the entity, mapped-superclass and embeddable elements defined in
        the same file in which they occur.

        3. The sequence-generator, table-generator, named-query,
        named-native-query and sql-result-set-mapping elements are global
        to the persistence unit. It is undefined to have more than one
        sequence-generator or table-generator of the same name in the same
        or different mapping files in a persistence unit. It is also 
        undefined to have more than one named-query or named-native-query
        of the same name in the same or different mapping files in a 
        persistence unit.

        4. The entity, mapped-superclass and embeddable elements each define
        the mapping information for a managed persistent class. The mapping
        information contained in these elements may be complete or it may
        be partial.

        </xsd:documentation>
      </xsd:annotation>
      <xsd:sequence>
        <xsd:element name="description" type="xsd:string"
                     minOccurs="0"/>
        <xsd:element name="persistence-unit-metadata" 
                     type="orm:persistence-unit-metadata"
                     minOccurs="0"/>
        <xsd:element name="package" type="xsd:string"
                     minOccurs="0"/>
        <xsd:element name="schema" type="xsd:string"
                     minOccurs="0"/>
        <xsd:element name="catalog" type="xsd:string"
                     minOccurs="0"/>
        <xsd:element name="access" type="orm:access-type"
                     minOccurs="0"/>
                     <!-- Guy -->
        <xsd:element name="converter" type="orm:converter" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="type-converter" type="orm:type-converter" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="object-type-converter" type="orm:object-type-converter" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="struct-converter" type="orm:struct-converter" 
                     minOccurs="0" maxOccurs="unbounded"/>
                     <!-- Guy -->
        <xsd:element name="sequence-generator" type="orm:sequence-generator"
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="table-generator" type="orm:table-generator" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="named-query" type="orm:named-query" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="named-native-query" type="orm:named-native-query"
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="sql-result-set-mapping" 
                     type="orm:sql-result-set-mapping" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="mapped-superclass" type="orm:mapped-superclass" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="entity" type="orm:entity" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="embeddable" type="orm:embeddable" 
                     minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="version" type="orm:versionType" 
                     fixed="1.0" use="required"/>
    </xsd:complexType>
  </xsd:element>

  <!-- **************************************************** -->

  <xsd:complexType name="persistence-unit-metadata">
    <xsd:annotation>
      <xsd:documentation>

        Metadata that applies to the persistence unit and not just to 
        the mapping file in which it is contained. 

        If the xml-mapping-metadata-complete element is specified then 
        the complete set of mapping metadata for the persistence unit 
        is contained in the XML mapping files for the persistence unit.

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="xml-mapping-metadata-complete" type="orm:emptyType"
                   minOccurs="0"/>
      <xsd:element name="persistence-unit-defaults" 
                   type="orm:persistence-unit-defaults"
                   minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- **************************************************** -->

	<xsd:complexType name="optimistic-locking">
	  <xsd:annotation>
	    <xsd:documentation>
	     @Target({TYPE})
	     @Retention(RUNTIME)
	     public @interface OptimisticLocking {
	       /**
	        * (Optional) The type of optimistic locking policy to use.
	        */
	       OptimisticLockingType type() default VERSION_COLUMN;
	
	       /**
	        * (Optional) For an optimistic locking policy of type SELECTED_COLUMNS, this annotation
	        * member becomes a (Required) field.
	        */
	       Column[] selectedColumns() default {};
	
	       /**
	        * (Optional) Specify where the optimistic locking policy should cascade lock. Currently
	        * only supported with VERSION_COLUMN locking.
	        */
	       boolean cascade() default false;
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:sequence>
	    <xsd:element name="selected-column" type="orm:column" minOccurs="0" maxOccours="unbounded"/>    
	  </xsd:sequence>
	  <xsd:attribute name="type" type="orm:optimisitic-locking-type"/>
	  <xsd:attribute name="cascade" type="xsd:boolean"/>
	</xsd:complexType>

  <!-- **************************************************** -->

	<xsd:simpleType name="optimistic-locking-type">
	  <xsd:annotation>
	    <xsd:documentation>
	      public enum OptimisticLockingType {
	        /**
	         * Using this type of locking policy compares every field in the table
	         * in the WHERE clause when doing an update or a delete. If any field
	         * has been changed, an optimistic locking exception will be thrown.
	         */
	        ALL_COLUMNS,
	
	        /**
	         * Using this type of locking policy compares only the changed fields
	         * in the WHERE clause when doing an update. If any field has been
	         * changed, an optimistic locking exception will be thrown. A delete
	         * will only compare the primary key.
	         */
	        CHANGED_COLUMNS,
	
	        /**
	         * Using this type of locking compares selected fields in the WHERE
	         * clause when doing an update or a delete. If any field has been
	         * changed, an optimistic locking exception will be thrown. Note that
	         * the fields specified must be mapped and not be primary keys.
	         */
	        SELECTED_COLUMNS,
	
	        /**
	         * Using this type of locking policy compares a single version number
	         * in the where clause when doing an update. The version field must be
	         * mapped and not be the primary key.
	         */
	        VERSION_COLUMN
	      }
	    </xsd:annotation>
	  </xsd:documentation>
	  <xsd:restriction base="xsd:token">
	    <xsd:enumeration value="ALL_COLUMNS"/>
	    <xsd:enumeration value="CHANGED_COLUMNS"/>
	    <xsd:enumeration value="SELECTED_COLUMNS"/>
	    <xsd:enumeration value="VERSION_COLUMN"/>
	  </xsd:restriction>
	</xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="persistence-unit-defaults">
    <xsd:annotation>
      <xsd:documentation>

        These defaults are applied to the persistence unit as a whole 
        unless they are overridden by local annotation or XML 
        element settings. 
        
        schema - Used as the schema for all tables or secondary tables
            that apply to the persistence unit
        catalog - Used as the catalog for all tables or secondary tables
            that apply to the persistence unit
        access - Used as the access type for all managed classes in
            the persistence unit
        cascade-persist - Adds cascade-persist to the set of cascade options
            in entity relationships of the persistence unit
        entity-listeners - List of default entity listeners to be invoked 
            on each entity in the persistence unit. 

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
        <xsd:element name="schema" type="xsd:string"
                     minOccurs="0"/>
        <xsd:element name="catalog" type="xsd:string"
                     minOccurs="0"/>
        <xsd:element name="access" type="orm:access-type"
                     minOccurs="0"/>
        <xsd:element name="cascade-persist" type="orm:emptyType" 
                     minOccurs="0"/>
        <xsd:element name="entity-listeners" type="orm:entity-listeners"
                     minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="entity">
    <xsd:annotation>
      <xsd:documentation>

        Defines the settings and mappings for an entity. Is allowed to be
        sparsely populated and used in conjunction with the annotations.
        Alternatively, the metadata-complete attribute can be used to 
        indicate that no annotations on the entity class (and its fields
        or properties) are to be processed. If this is the case then 
        the defaulting rules for the entity and its subelements will 
        be recursively applied.

        @Target(TYPE) @Retention(RUNTIME)
          public @interface Entity {
          String name() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
      <xsd:element name="table" type="orm:table" 
                   minOccurs="0"/>
      <xsd:element name="secondary-table" type="orm:secondary-table" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="primary-key-join-column" 
                   type="orm:primary-key-join-column" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
      <xsd:element name="inheritance" type="orm:inheritance" minOccurs="0"/>
      <xsd:element name="discriminator-value" type="orm:discriminator-value" 
                   minOccurs="0"/>
      <xsd:element name="discriminator-column" 
                   type="orm:discriminator-column" 
                   minOccurs="0"/>
      <xsd:element name="sequence-generator" type="orm:sequence-generator" 
                   minOccurs="0"/>
      <xsd:element name="table-generator" type="orm:table-generator" 
                   minOccurs="0"/>
      <xsd:element name="named-query" type="orm:named-query" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="named-native-query" type="orm:named-native-query" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="sql-result-set-mapping" 
                   type="orm:sql-result-set-mapping" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="exclude-default-listeners" type="orm:emptyType" 
                   minOccurs="0"/>
      <xsd:element name="exclude-superclass-listeners" type="orm:emptyType" 
                   minOccurs="0"/>
      <xsd:element name="entity-listeners" type="orm:entity-listeners" 
                   minOccurs="0"/>
      <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
      <xsd:element name="post-persist" type="orm:post-persist" 
                   minOccurs="0"/>
      <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
      <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
      <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
      <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
      <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
      <xsd:element name="attribute-override" type="orm:attribute-override" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="association-override" 
                   type="orm:association-override"
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="converter" type="orm:converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="type-converter" type="orm:type-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="object-type-converter" type="orm:object-type-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="struct-converter" type="orm:struct-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="optimistic-locking" type="orm:optimistic-locking" minOccurs="0"/>
      <xsd:element name="cache" type="orm:cache" minOccurs="0"/>
      <xsd:element name="change-tracking" type="orm:change-tracking"/>
      <xsd:element name="customizer" type="orm:customizer"/>
      <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string"/>
    <xsd:attribute name="class" type="xsd:string" use="required"/>
    <xsd:attribute name="access" type="orm:access-type"/>
    <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
    <xsd:attribute name="read-only" type="xsd:boolean"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="attributes">
    <xsd:annotation>
      <xsd:documentation>

        This element contains the entity field or property mappings.
        It may be sparsely populated to include only a subset of the
        fields or properties. If metadata-complete for the entity is true
        then the remainder of the attributes will be defaulted according
        to the default rules.

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:choice>
        <xsd:element name="id" type="orm:id" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="embedded-id" type="orm:embedded-id" 
                     minOccurs="0"/>
      </xsd:choice>
      <xsd:element name="basic" type="orm:basic"
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="version" type="orm:version"
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="many-to-one" type="orm:many-to-one"
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="one-to-many" type="orm:one-to-many"
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="one-to-one" type="orm:one-to-one"
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="many-to-many" type="orm:many-to-many" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="embedded" type="orm:embedded"
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="transient" type="orm:transient"
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:simpleType name="access-type">
    <xsd:annotation>
      <xsd:documentation>

        This element determines how the persistence provider accesses the
        state of an entity or embedded object.

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
      <xsd:enumeration value="PROPERTY"/>
      <xsd:enumeration value="FIELD"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="entity-listeners">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface EntityListeners {
          Class[] value();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="entity-listener" type="orm:entity-listener" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="entity-listener">
    <xsd:annotation>
      <xsd:documentation>

        Defines an entity listener to be invoked at lifecycle events
        for the entities that list this listener.

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
      <xsd:element name="post-persist" type="orm:post-persist" 
                   minOccurs="0"/>
      <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
      <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
      <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
      <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
      <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="class" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="pre-persist">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD}) @Retention(RUNTIME)
        public @interface PrePersist {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="post-persist">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD}) @Retention(RUNTIME)
        public @interface PostPersist {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="pre-remove">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD}) @Retention(RUNTIME)
        public @interface PreRemove {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="post-remove">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD}) @Retention(RUNTIME)
        public @interface PostRemove {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="pre-update">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD}) @Retention(RUNTIME)
        public @interface PreUpdate {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="post-update">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD}) @Retention(RUNTIME)
        public @interface PostUpdate {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="post-load">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD}) @Retention(RUNTIME)
        public @interface PostLoad {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="query-hint">
    <xsd:annotation>
      <xsd:documentation>

        @Target({}) @Retention(RUNTIME) 
        public @interface QueryHint {
          String name();
          String value();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="value" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="named-query">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface NamedQuery {
          String name();
          String query();
          QueryHint[] hints() default {};
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="query" type="xsd:string"/>
      <xsd:element name="hint" type="orm:query-hint" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

	<xsd:complexType name="named-store-procedure-query">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      @Target({TYPE})
	      @Retention(RUNTIME)
	      public @interface NamedStoredProcedureQuery {
	        /**
	         * (Required) Unique name that references this stored procedure query.
	         */
	        String name();
	
	        /**
	         * (Optional) Query hints.
	         */
	        QueryHint[] hints() default {};
	
	        /**
	         * (Optional) Refers to the class of the result.
	         */
	        Class resultClass() default void.class;
	
	        /**
	         * (Optional) The name of the SQLResultMapping.
	         */
	        String resultSetMapping() default "";
	
	        /**
	         * (Required) The name of the stored procedure.
	         */
	        String procedureName();
	
	        /**
	         * (Optional) Whether the query should return a result set.
	         */
	        boolean returnsResultSet() default true; 
	
	        /**
	         * (Optional) Defines arguments to the stored procedure.
	         */
	        StoredProcedureParameter[] procedureParameters() default {};
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	    <xsd:sequence>
	      <xsd:element name="hint" type="orm:hint" minOccurs="0" maxOccurs="unbounded">
	      <xsd:element name="procedure-parameter" type="orm:procedure-parameter" minOccurs="0" maxOccurs="unbounded">
	    </xsd:sequence>
	  <xsd:attribute name="name" type="xsd:string" use="required"/>
	  <xsd:attribute name="result-class" type="xsd:string"/>
	  <xsd:attribute name="result-set-mapping" type="xsd:string"/>
	  <xsd:attribute name="procedure-name" type="xsd:string" user="required"/>
	  <xsd:attribute name="returns-result-set" type="xsd:boolean"/>
	</xsd:complexType>

  <!-- **************************************************** -->

	<xsd:complexType name="stored-procedure-parameter">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      @Target({})
	      @Retention(RUNTIME)
	      public @interface StoredProcedureParameter {
	        /**
	         * (Optional) The direction of the stored procedure parameter.
	         */
	        Direction procedureParameterDirection() default IN;
	
	        /**
	         * (Optional) Stored procedure parameter name.
	         */
	        String name() default "";
	
	        /**
	         * (Required) The query parameter name.
	         */
	        String queryParameter();
	
	        /**
	         * (Optional) The type of Java class desired back from the procedure, 
	         * this is dependent on the type returned from the procedure.
	         */
	        Class type() default void.class;
	
	        /**
	         * (Optional) The JDBC type code, this dependent on the type returned 
	         * from the procedure.
	         */
	        int jdbcType() default -1;
	
	        /**
	         * (Optional) The JDBC type name, this may be required for ARRAY or 
	         * STRUCT types.
	         */
	        String jdbcTypeName() default "";
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:attribute name="procedure-parameter-direction" type="orm:direction-type">
	  <xsd:attribute name="name" type="xsd:string"/>
	  <xsd:attribute name="query-parameter" type="xsd:string" use="required"/>
	  <xsd:attribute name="type" type="xsd:string"/>
	  <xsd:attribute name="jdbc-type" type="xsd:integer"/>
	  <xsd:attribute name="jdbc-type-name" type="xsd:string"/>
	</xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="named-native-query">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface NamedNativeQuery {
          String name();
          String query();
          QueryHint[] hints() default {};
          Class resultClass() default void.class;
          String resultSetMapping() default ""; //named SqlResultSetMapping
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="query" type="xsd:string"/>
      <xsd:element name="hint" type="orm:query-hint" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="result-class" type="xsd:string"/>
    <xsd:attribute name="result-set-mapping" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="sql-result-set-mapping">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface SqlResultSetMapping {
          String name();
          EntityResult[] entities() default {};
          ColumnResult[] columns() default {};
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="entity-result" type="orm:entity-result" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="column-result" type="orm:column-result" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="entity-result">
    <xsd:annotation>
      <xsd:documentation>

        @Target({}) @Retention(RUNTIME)
        public @interface EntityResult {
          Class entityClass();
          FieldResult[] fields() default {};
          String discriminatorColumn() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="field-result" type="orm:field-result" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="entity-class" type="xsd:string" use="required"/>
    <xsd:attribute name="discriminator-column" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="field-result">
    <xsd:annotation>
      <xsd:documentation>

        @Target({}) @Retention(RUNTIME)
        public @interface FieldResult {
          String name();
          String column();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="column" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="column-result">
    <xsd:annotation>
      <xsd:documentation>

        @Target({}) @Retention(RUNTIME)
        public @interface ColumnResult {
          String name();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>
  
  <!-- **************************************************** -->
  
  <xsd:complexType name="converter">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE, METHOD, FIELD})
        @Retention(RUNTIME)
        public @interface Converter {
          /**
           * (Required) Name this converter. The name should be unique
           * across the whole persistence unit.
           */
          String name();

          /**
           * (Required) The converter class to be used. This class must implement 
           * the org.eclipse.persistence.mappings.converters.Converter interface.
           */
          Class converterClass(); 
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="converter-class" type="xsd:string" use="required"/>
  </xsd:complexType>
  
  <!-- **************************************************** -->
  
  <xsd:complexType name="type-converter">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE, METHOD, FIELD})
        @Retention(RUNTIME)
        public @interface TypeConverter {
          /**
           * (Required) Name this converter. The name should be unique
           * across the whole persistence unit.
           */
           String name();

          /**
           * (Optional) Specify the type stored on the database. The
           * default is inferred from the type of the persistence field 
           * or property.
           */
          Class dataType() default void.class;

          /**
           * (Optional) Specify the type stored on the entity. The
           * default is inferred from the type of the persistent field 
           * or property.
           */
          Class objectType() default void.class;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="data-type" type="xsd:string"/>
    <xsd:attribute name="object-type" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

	<xsd:complexType name="object-type-converter">
	  <xsd:complexContent>  
	    <xsd:extension base=type-converter>
	      <xsd:annotation>
	        <xsd:documentation>
	
	          @Target({TYPE, METHOD, FIELD})
	          @Retention(RUNTIME)
	          public @interface ObjectTypeConverter {
	            /**
	             * (Required) Name this converter. The name should be unique
	             * across the whole persistence unit.
	             */
	            String name();
	
	            /**
	             * (Optional) Specify the type stored on the database. The
	             * default is inferred from the type of the persistence
	             * field or property.
	             */
	            Class dataType() default void.class;
	
	            /**
	             * (Optional) Specify the type stored on the entity. The
	             * default is inferred from the type of the persistent 
	             * field or property.
	             */
	            Class objectType() default void.class;
	
	            /**
	             * (Required) Specify the conversion values to be used 
	             * with the object converter.
	             */
	            ConversionValue[] conversionValues();
	
	            /**
	             * (Optional) Specify a default object value. Used for 
	             * legacy data if the data value is missing.
	             */
	            String defaultObjectValue() default "";
	          }
	
	        </xsd:documentation>
	      </xsd:annotation>
	      <xsd:sequence>
	        <xsd:element name="conversion-value" type="orm:conversion-value" minOccurs="1" maxOccurs=unbounded/>
	        <xsd:element name="default-object-value" type="xsd:string" minOccurs="0"/>
	      </xsd:sequence>
	    </xsd:entension>
	  </xsd:complexContent>
	</xsd:complexType>

  <!-- **************************************************** -->

	<xsd:complexType name="conversion-value">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      @Target({})
	      @Retention(RUNTIME)
	      public @interface ConversionValue {
	        /**
	         * (Required) Specify the database value.
	         */
	        String dataValue();
	
	        /**
	         * (Required) Specify the object value.
	         */
	        String objectValue();
	      }
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:attribute name="data-value" type="xsd:string"/>
	  <xsd:attribute name="object-value" type="xsd:string"/>
	</xsd:complexType>

  <!-- **************************************************** -->

	<xsd:complexType name="struct-converter">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      @Target({TYPE, METHOD, FIELD})
	      @Retention(RUNTIME)
	      public @interface StructConverter {
	        /**
	         * (Required) Name this converter. The name should be unique across the 
	         * whole persistence unit.
	         */
	        String name();
	
	        /**
	         * (Required) The converter class to be used. This class must implement the
	         * TopLink org.eclipse.persistence.mappings.converters.Converter interface.
	         */
	        String converter(); 
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:attribute name="name" type="xsd:string" use="required">
	  <xsd:attribute name="converter" type="xsd:string" use="required"/>
	</xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="table">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface Table {
          String name() default "";
          String catalog() default "";
          String schema() default "";
          UniqueConstraint[] uniqueConstraints() default {};
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="unique-constraint" type="orm:unique-constraint" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string"/>
    <xsd:attribute name="catalog" type="xsd:string"/>
    <xsd:attribute name="schema" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="change-tracking">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE})
        @Retention(RUNTIME)
        public @interface ChangeTracking {
          /**
           * (Optional) The type of change tracking to use.
           */ 
          ChangeTrackingType value() default AUTO;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="type" type="orm:change-tracking-type" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="customizer">
    <xsd:annotation>
      <xsd:documentation>

      @Target({TYPE})
      @Retention(RUNTIME)
      public @interface Customizer {
        /**
         * (Required) Defines the name of the descriptor customizer class that 
         * should be applied for the related entity or embeddable class.
         */
        Class value(); 
      }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="class" type="xsd:string" use="required"/>
  </xsd:complexType>
  
  <!-- **************************************************** -->

	<xsd:complexType name="collection-table">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      @Target({METHOD, FIELD})
	      @Retention(RUNTIME)
	      public @interface CollectionTable {
	        /**
	         * (Optional) The name of the collection table. If it is not specified, it is defaulted to the
	         * concatenation of the following: the name of the source entity; "_" ; the name of the 
	         * relationship property or field of the source entity.
	         */
	        String name() default ""; 
	
	        /**
	         * (Optional) The catalog of the table. It defaults to the persistence unit default catalog.
	         */
	        String catalog() default ""; 
	
	        /**
	         * (Optional) The schema of the table. It defaults to the persistence unit default schema.
	         */
	        String schema() default ""; 
	
	        /**
	         * (Optional) Used to specify a primary key column that is used as a foreign key to join to
	         * another table. If the source entity uses a composite primary key, a primary key join column 
	         * must be specified for each field of the composite primary key. In a single primary key case, 
	         * a primary key join column may optionally be specified. Defaulting will apply otherwise as 
	         * follows:
	         * name, the same name as the primary key column of the primary table of the source entity.
	         * referencedColumnName, the same name of primary key column of the primary table of the source 
	         * entity.
	         */
	        PrimaryKeyJoinColumn[] primaryKeyJoinColumns() default {}; 
	 
	        /**
	         * (Optional) Unique constraints that are to be placed on the table. These are only
	         * used if table generation is in effect.
	         */
	        UniqueConstraint[] uniqueConstraints() default {}; 
	     }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:sequence>
	    <xsd:element name="primary-key-join-column" type="orm:primary-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
	    <xsd:element name="unique-constraint" type="orm:unique-constraint" minOccurs="0" maxOccurs="unbounded"/>
	  </xsd:sequence>
	  <xsd:attribute name="name" type="xsd:string"/>
	  <xsd:attribute name="catalog" type="xsd:string"/>
	  <xsd:attribute name="schema" type="xsd:string"/>
	</xsd:complexType>

  <!-- **************************************************** -->
  
	<xsd:complexType name="return-insert">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      @Target({METHOD, FIELD})
	      @Retention(RUNTIME)
	      public @interface ReturnInsert {
	        boolean returnOnly() default false;
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:attribute name="return-only" type="xsd:boolean"/>
	</xsd:complexType>
  
  <!-- **************************************************** -->

	<xsd:complexType name="return-update">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      @Target({METHOD, FIELD})
	      @Retention(RUNTIME)
	      public @interface ReturnUpdate {}
	
	    </xsd:documentation>
	  </xsd:annotation>
	</xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="secondary-table">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface SecondaryTable {
          String name();
          String catalog() default "";
          String schema() default "";
          PrimaryKeyJoinColumn[] pkJoinColumns() default {};
          UniqueConstraint[] uniqueConstraints() default {};
         }

       </xsd:documentation>
     </xsd:annotation>
     <xsd:sequence>
       <xsd:element name="primary-key-join-column" 
                    type="orm:primary-key-join-column" 
                    minOccurs="0" maxOccurs="unbounded"/>
       <xsd:element name="unique-constraint" type="orm:unique-constraint" 
                    minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="catalog" type="xsd:string"/>
    <xsd:attribute name="schema" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="unique-constraint">
    <xsd:annotation>
      <xsd:documentation>

        @Target({}) @Retention(RUNTIME)
        public @interface UniqueConstraint {
          String[] columnNames();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="column-name" type="xsd:string" 
                   maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="column">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Column {
          String name() default "";
          boolean unique() default false;
          boolean nullable() default true;
          boolean insertable() default true;
          boolean updatable() default true;
          String columnDefinition() default "";
          String table() default "";
          int length() default 255;
          int precision() default 0; // decimal precision
          int scale() default 0; // decimal scale
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string"/>
    <xsd:attribute name="unique" type="xsd:boolean"/>
    <xsd:attribute name="nullable" type="xsd:boolean"/>
    <xsd:attribute name="insertable" type="xsd:boolean"/>
    <xsd:attribute name="updatable" type="xsd:boolean"/>
    <xsd:attribute name="column-definition" type="xsd:string"/>
    <xsd:attribute name="table" type="xsd:string"/>
    <xsd:attribute name="length" type="xsd:int"/>
    <xsd:attribute name="precision" type="xsd:int"/>
    <xsd:attribute name="scale" type="xsd:int"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="join-column">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface JoinColumn {
          String name() default "";
          String referencedColumnName() default "";
          boolean unique() default false;
          boolean nullable() default true;
          boolean insertable() default true;
          boolean updatable() default true;
          String columnDefinition() default "";
          String table() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string"/>
    <xsd:attribute name="referenced-column-name" type="xsd:string"/>
    <xsd:attribute name="unique" type="xsd:boolean"/>
    <xsd:attribute name="nullable" type="xsd:boolean"/>
    <xsd:attribute name="insertable" type="xsd:boolean"/>
    <xsd:attribute name="updatable" type="xsd:boolean"/>
    <xsd:attribute name="column-definition" type="xsd:string"/>
    <xsd:attribute name="table" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->
  
	<xsd:simpleType name="join-fetch-type">
	  <xsd:annotation>
	    <xsd:documentation>
	    
	      public enum JoinFetchType {
	      /**
	       * An inner join is used to fetch the related object.
	       * This does not allow for null/empty values.
	       */
	      INNER,
	
	      /**
	       * An inner join is used to fetch the related object.
	       * This allows for null/empty values.
	       */
	      OUTER,
	    }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:restriction base="xsd:token">
	    <xsd:enumeration value="INNER"/>
	    <xsd:enumeration value="OUTER"/>
	  </xsd:restriction>
	</xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:simpleType name="generation-type">
    <xsd:annotation>
      <xsd:documentation>

        public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
      <xsd:enumeration value="TABLE"/>
      <xsd:enumeration value="SEQUENCE"/>
      <xsd:enumeration value="IDENTITY"/>
      <xsd:enumeration value="AUTO"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="attribute-override">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
        public @interface AttributeOverride {
          String name();
          Column column();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="column" type="orm:column"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="association-override">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
        public @interface AssociationOverride {
          String name();
          JoinColumn[] joinColumns();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="join-column" type="orm:join-column"
                   maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="id-class">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface IdClass {
          Class value();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="class" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="id">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Id {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="column" type="orm:column" minOccurs="0"/>
      <xsd:element name="generated-value" type="orm:generated-value" minOccurs="0"/>
      <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
      <xsd:element name="table-generator" type="orm:table-generator" minOccurs="0"/>
      <xsd:element name="sequence-generator" type="orm:sequence-generator" minOccurs="0"/>
      <xsd:element name="return-insert" type="orm:return-insert" minOccurs="0"/>
      <xsd:element name="return-update" type="orm:return-update" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="convert" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="embedded-id">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface EmbeddedId {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="attribute-override" type="orm:attribute-override" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="transient">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Transient {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="version">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Version {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="column" type="orm:column" minOccurs="0"/>
      <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
      <xsd:element name="return-insert" type="orm:return-insert" minOccurs="0"/>
      <xsd:element name="return-update" type="orm:return-update" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="convert" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="basic">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Basic {
          FetchType fetch() default EAGER;
          boolean optional() default true;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="column" type="orm:column" minOccurs="0"/>
      <xsd:choice>
        <xsd:element name="lob" type="orm:lob" minOccurs="0"/>
        <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
        <xsd:element name="enumerated" type="orm:enumerated" minOccurs="0"/>
      </xsd:choice>
      <xsd:element name="return-insert" type="orm:return-insert" minOccurs="0"/>
      <xsd:element name="return-update" type="orm:return-update" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="fetch" type="orm:fetch-type"/>
    <xsd:attribute name="optional" type="xsd:boolean"/>
    <xsd:attribute name="convert" type="xsd:string"/>
    <xsd:attribute name="mutable" type="xsd:boolean">
  </xsd:complexType>

  <!-- **************************************************** -->
  
	<xsd:complexType name="basic-collection">
	  <xsd:annotation>
	    <xsd:documentation>
	      @Target({METHOD, FIELD})
	      @Retention(RUNTIME)
	      public @interface BasicCollection {
	        /**
	         * (Optional) Defines whether the value of the field or property should
	         * be lazily loaded or must be eagerly fetched. The EAGER strategy is a 
	         * requirement on the persistence provider runtime that the value must be 
	         * eagerly fetched. The LAZY strategy is a hint to the persistence provider 
	         * runtime. If not specified, defaults to LAZY.
	         */
	        FetchType fetch() default LAZY; 
	 
	        /**
	         * (Optional) The name of the value column that holds the direct collection 
	         * data. Defaults to the property or field name.
	         */
	        Column valueColumn() default @Column;
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:sequence>
	    <xsd:element name="value-column" type="orm:column" minOccurs="0"/>
	    <xsd:element name="collection-table" type="orm:collection-table" minOccurs="0"/>
	  </xsd:sequence>
	  <xsd:attribute name="fetch" type="orm:fetch-type"/>
	  <xsd:attribute name="convert" type="xsd:string"/>
	  <xsd:attribute name="private-owned" type="xsd:boolean"/>
	  <xsd:attribute name="join-fetch" type="orm:join-fetch-type">
	</xsd:complexType>

  <!-- **************************************************** -->

	<xsd:complexType name="basic-map">
	  <xsd:annotation>
	    <xsd:documentation>
	      @Target({METHOD, FIELD})
	      @Retention(RUNTIME)
	      public @interface BasicMap {
	        /**
	         * (Optional) Defines whether the value of the field or property should
	         * be lazily loaded or must be eagerly fetched. The EAGER strategy is a 
	         * requirement on the persistence provider runtime that the value must be 
	         * eagerly fetched. The LAZY strategy is a hint to the persistence provider 
	         * runtime. If not specified, defaults to LAZY.
	         */
	        FetchType fetch() default LAZY;
	
	        /**
	         * (Optional) The name of the data column that holds the direct map key.
	         * If the name on te key column is "", the name will default to:
	         * the name of the property or field; "_key".
	         */
	        Column keyColumn();
	
	        /**
	         * (Optional) Specify the key converter. Default is equivalent to specifying
	         * @Convert("none"), meaning no converter will be added to the direct map key.
	         */
	        Convert keyConverter() default @Convert;
	
	        /**
	         * (Optional) The name of the data column that holds the direct collection data.
	         * Defaults to the property or field name.
	         */
	        Column valueColumn() default @Column;
	
	        /**
	         * (Optional) Specify the value converter. Default is equivalent to specifying 
	         * @Convert("none"), meaning no converter will be added to the value column mapping.
	         */
	        Convert valueConverter() default @Convert;
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:sequence>
	    <xsd:element name="key-column" type="orm:column" minOccurs="0"/>    
	    <xsd:element name="value-column" type="orm:column" minOccurs="0"/>    
	    <xsd:element name="collection-table" type="xsd:collection-table" minOccurs="0"/>
	  </xsd:sequence>
	  <xsd:attribute name="fetch" type="orm:fetch-type"/>
	  <xsd:attribute name="key-converter" type="xsd:string"/>
	  <xsd:attribute name="value-converter" type="xsd:string"/>
	  <xsd:attribute name="join-fetch" type="orm:join-fetch-type">
	</xsd:complexType>

  <!-- **************************************************** -->

  <xsd:simpleType name="fetch-type">
    <xsd:annotation>
      <xsd:documentation>

        public enum FetchType { LAZY, EAGER };

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
      <xsd:enumeration value="LAZY"/>
      <xsd:enumeration value="EAGER"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="lob">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Lob {}

      </xsd:documentation>
    </xsd:annotation>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:simpleType name="temporal">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Temporal {
          TemporalType value();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="orm:temporal-type"/>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:simpleType name="temporal-type">
    <xsd:annotation>
      <xsd:documentation>

        public enum TemporalType {
          DATE, // java.sql.Date
          TIME, // java.sql.Time
          TIMESTAMP // java.sql.Timestamp
        }

      </xsd:documentation>
    </xsd:annotation>
      <xsd:restriction base="xsd:token">
        <xsd:enumeration value="DATE"/>
        <xsd:enumeration value="TIME"/>
        <xsd:enumeration value="TIMESTAMP"/>
     </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:simpleType name="enumerated">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Enumerated {
          EnumType value() default ORDINAL;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="orm:enum-type"/>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:simpleType name="enum-type">
    <xsd:annotation>
      <xsd:documentation>

        public enum EnumType {
          ORDINAL,
          STRING
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
      <xsd:enumeration value="ORDINAL"/>
      <xsd:enumeration value="STRING"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="many-to-one">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface ManyToOne {
          Class targetEntity() default void.class;
          CascadeType[] cascade() default {};
          FetchType fetch() default EAGER;
          boolean optional() default true;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:choice>       
        <xsd:element name="join-column" type="orm:join-column" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="join-table" type="orm:join-table" 
                     minOccurs="0"/>
      </xsd:choice>       
      <xsd:element name="cascade" type="orm:cascade-type" 
                   minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="target-entity" type="xsd:string"/>
    <xsd:attribute name="fetch" type="orm:fetch-type"/>
    <xsd:attribute name="optional" type="xsd:boolean"/>
    <xsd:attribute name="join-fetch" type="orm:join-fetch-type">
  </xsd:complexType>

  <!-- **************************************************** -->
  
	<xsd:complexType name="cache">
	  <xsd:annotation>
	    <xsd:documentation>
	      @Target({TYPE})
	      @Retention(RUNTIME)
	      public @interface Cache {
	        /**
	         * (Optional) The type of cache to use.
	         */ 
	        CacheType type() default SOFT_WEAK;
	
	        /**
           * (Optional) The size of cache to use.
           */ 
          int size() default 100;
    
	        /**
	         * (Optional) Cached instances in the shared cache or a client isolated cache.
	         */ 
	        boolean isolated() default false;
	
	        /**
	         * (Optional) Expire cached instance after a fix period of time (ms). 
	         * Queries executed against the cache after this will be forced back 
	         * to the database for a refreshed copy
	         */ 
	        int expiry() default -1; // minus one is no expiry.
	
	        /**
	         * (Optional) Expire cached instance a specific time of day. Queries 
	         * executed against the cache after this will be forced back to the 
	         * database for a refreshed copy
	         */ 
	        TimeOfDay expiryTimeOfDay() default @TimeOfDay(specified=false);
	
	        /**
	         * (Optional) Force all queries that go to the database to always 
	         * refresh the cache.
	         */ 
	        boolean alwaysRefresh() default false;
	
	        /**
	         * (Optional) For all queries that go to the database, refresh the cache 
	         * only if the data received from the database by a query is newer than 
	         * the data in the cache (as determined by the optimistic locking field)
	         */ 
	        boolean refreshOnlyIfNewer() default false;
	
	        /**
	         * (Optional) Setting to true will force all queries to bypass the 
	         * cache for hits but still resolve against the cache for identity. 
	         * This forces all queries to hit the database.
	         */ 
	        boolean disableHits() default false;
	
	        /**
	         * (Optional) The cache coordination mode.
	         */ 
	        CacheCoordinationType coordinationType() default SEND_OBJECT_CHANGES;
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:choice>
	    <xsd:element name="expiry" type="xsd:integer" minOccurs=0/>
	    <xsd:element name="expiry-time-of-day" type="orm:time-of-day" minOccurs=0/>
	  </xsd:choice>
	  <xsd:attribute name="size" type="xsd:integer/>
	  <xsd:attribute name="isolated" type="xsd:boolean/>
	  <xsd:attribute name="type" type="orm:cache-type"/>
	  <xsd:attribute name="always-refresh" type="xsd:boolean"/>
	  <xsd:attribute name="refresh-only-if-newer" type="xsd:boolean"/>
	  <xsd:attribute name="disable-hits" type="xsd:boolean"/>
	  <xsd:attribute name="coordination-type" type="orm:cache-coordination-type"/>
	</xsd:complexType>
  
  <!-- **************************************************** -->
  
	<xsd:simpleType name="cache-type">
	  <xsd:annotation>
	    <xsd:documentation>
	
	      public enum CacheType {
	        /**
	         * Provides full caching and guaranteed identity. Caches all objects
	         * and does not remove them. 
	         * WARNING: This method may be memory intensive when many objects are 
	         * read.
	         */
	        FULL,
	
	        /**
	         * Similar to the FULL identity map except that the map holds the
	         * objects using weak references. This method allows full garbage
	         * collection and provides full caching and guaranteed identity.
	         */
	        WEAK,
	
	        /**
           * Similar to the FULL identity map except that the map holds the
           * objects using soft references. This method allows full garbage
           * collection when memory is low and provides full caching and 
           * guaranteed identity.
           */
          SOFT,
    
	        /**
	         * Similar to the WEAK identity map except that it maintains a
	         * most-frequently-used sub-cache. The size of the sub-cache is
	         * proportional to the size of the identity map as specified by
	         * descriptor's setIdentityMapSize() method. The sub-cache
	         * uses soft references to ensure that these objects are
	         * garbage-collected only if the system is low on memory.
	         */
	        SOFT_WEAK,
	
	        /**
	         * Identical to the soft cache weak (SOFT_WEAK) identity map except 
	         * that it uses hard references in the sub-cache. Use this identity 
	         * map if soft references do not behave properly on your platform.
	         */
	        HARD_WEAK,
	
	        /**
	         * A cache identity map maintains a fixed number of objects
	         * specified by the application. Objects are removed from the cache
	         * on a least-recently-used basis. This method allows object
	         * identity for the most commonly used objects.
	         * WARNING: Furnishes caching and identity, but does not guarantee 
	         * identity.
	         */
	        CACHE,
	
	        /**
	         * WARNING: Does not preserve object identity and does not cache 
	         * objects.
	         */
	        NONE
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:restriction base="xsd:token">
	    <xsd:enumeration value="FULL"/>
	    <xsd:enumeration value="WEAK"/>
	    <xsd:enumeration value="SOFT"/>
	    <xsd:enumeration value="SOFT_WEAK"/>
	    <xsd:enumeration value="HARD_WEAK"/>
	    <xsd:enumeration value="CACHE"/>
	    <xsd:enumeration value="NONE"/>
	  </xsd:restriction>
	</xsd:simpleType>

  <!-- **************************************************** -->

	 <xsd:annotation>
	    <xsd:documentation>
	
	        public enum CacheCoordinationType {
	        /**
	         * Sends a list of changed objects including data about the changes. This data is merged into 
	         * the receiving cache.
	         */
	        SEND_OBJECT_CHANGES,
	
	        /**
	         * Sends a list of the identities of the objects that have changed. The receiving cache 
	         * invalidates the objects (rather than changing any of the data)
	         */
	        INVALIDATE_CHANGED_OBJECTS,
	
	        /**
	         * Same as SEND_OBJECT_CHANGES except it also includes any newly created objects from the 
	         * transaction.
	         */
	        SEND_NEW_OBJECTS_WITH_CHANGES,
	
	        /**
	         * Does no cache coordination.
	         */
	        NONE
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:restriction base="xsd:token">
	    <xsd:enumeration value="SEND_OBJECT_CHANGES"/>
	    <xsd:enumeration value="INVALIDATE_CHANGED_OBJECTS"/>
	    <xsd:enumeration value="SEND_NEW_OBJECTS_WITH_CHANGES"/>
	    <xsd:enumeration value="NONE"/>
	  </xsd:restriction>
	</xsd:simpleType>

  <!-- **************************************************** -->

	<xsd:complexType name="time-of-day">
	  <xsd:annotation>
	    <xsd:documentation>
	      @Target({})
	      @Retention(RUNTIME)
	      public @interface TimeOfDay {
	        /**
	         * (Optional) Hour of the day.
	         */ 
	        int hour() default 0;
	
	        /**
	         * (Optional) Minute of the day.
	         */ 
	        int minute() default 0;
	
	        /**
	         * (Optional) Second of the day.
	         */ 
	        int second() default 0;
	
	        /**
	         * (Optional) Millisecond of the day.
	         */ 
	        int millisecond() default 0;
	
	        /**
	         * Internal use. Do not modify.
	         */ 
	        boolean specified() default true;
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:attribute name="hour" type="xsd:integer"/>
	  <xsd:attribute name="minute" type="xsd:integer"/>
	  <xsd:attribute name="second" type="xsd:integer"/>
	  <xsd:attribute name="millisecond" type="xsd:integer"/>
	</xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="cascade-type">
    <xsd:annotation>
      <xsd:documentation>

        public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH};

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="cascade-all" type="orm:emptyType"
                   minOccurs="0"/>
      <xsd:element name="cascade-persist" type="orm:emptyType"
                   minOccurs="0"/>
      <xsd:element name="cascade-merge" type="orm:emptyType"
                   minOccurs="0"/>
      <xsd:element name="cascade-remove" type="orm:emptyType"
                   minOccurs="0"/>
      <xsd:element name="cascade-refresh" type="orm:emptyType"
                   minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- **************************************************** -->
  
	<xsd:simpleType name="change-tracking-type">
	  <xsd:annotation>
	    <xsd:documentation>
	      public enum ChangeTrackingType {
	        /**
	         * An ATTRIBUTE change tracking type allows change tracking at the attribute 
	         * level of an object. Objects with changed attributes will be processed in 
	         * the commit process to include any changes in the results of the commit.
	         * Unchanged objects will be ignored.
	         */
	        ATTRIBUTE,
	
	        /**
	         * An OBJECT change tracking policy allows an object to calculate for itself 
	         * whether it has changed. Changed objects will be processed in the commit 
	         * process to include any changes in the results of the commit.
	         * Unchanged objects will be ignored.
	         */
	        OBJECT,
	
	        /**
	         * A DEFERRED change tracking policy defers all change detection to the 
	         * UnitOfWork's change detection process. Essentially, the calculateChanges() 
	         * method will run for all objects in a UnitOfWork. 
	         * This is the default ObjectChangePolicy
	         */
	        DEFERRED,
	
	        /**
	         * Will not set any change tracking policy.
	         */
	        AUTO
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:restriction base="xsd:token">
	    <xsd:enumeration value="ATTRIBUTE"/>
	    <xsd:enumeration value="OBJECT"/>
	    <xsd:enumeration value="DEFERRED"/>
	    <xsd:enumeration value="AUTO"/>
	  </xsd:restriction>
	</xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="one-to-one">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface OneToOne {
          Class targetEntity() default void.class;
          CascadeType[] cascade() default {};
          FetchType fetch() default EAGER;
          boolean optional() default true;
          String mappedBy() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:choice>
        <xsd:element name="primary-key-join-column" 
                     type="orm:primary-key-join-column" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="join-column" type="orm:join-column" 
                     minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="join-table" type="orm:join-table" 
                     minOccurs="0"/>
      </xsd:choice>
      <xsd:element name="cascade" type="orm:cascade-type" 
                   minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="target-entity" type="xsd:string"/>
    <xsd:attribute name="fetch" type="orm:fetch-type"/>
    <xsd:attribute name="optional" type="xsd:boolean"/>
    <xsd:attribute name="mapped-by" type="xsd:string"/>
    <xsd:attribute name="private-owned" type="xsd:boolean"/>
    <xsd:attribute name="join-fetch" type="orm:join-fetch-type">
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="one-to-many">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface OneToMany {
          Class targetEntity() default void.class;
          CascadeType[] cascade() default {};
          FetchType fetch() default LAZY;
          String mappedBy() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="order-by" type="orm:order-by" 
                   minOccurs="0"/>
      <xsd:element name="map-key" type="orm:map-key" 
                   minOccurs="0"/>
      <xsd:choice>       
        <xsd:element name="join-table" type="orm:join-table" 
                     minOccurs="0"/>
        <xsd:element name="join-column" type="orm:join-column" 
                     minOccurs="0" maxOccurs="unbounded"/>
      </xsd:choice>       
      <xsd:element name="cascade" type="orm:cascade-type" 
                   minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="target-entity" type="xsd:string"/>
    <xsd:attribute name="fetch" type="orm:fetch-type"/>
    <xsd:attribute name="mapped-by" type="xsd:string"/>
    <xsd:attribute name="private-owned" type="xsd:boolean"/>
    <xsd:attribute name="join-fetch" type="orm:join-fetch-type">
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="join-table">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD})
        public @interface JoinTable {
          String name() default "";
          String catalog() default "";
          String schema() default "";
          JoinColumn[] joinColumns() default {};
          JoinColumn[] inverseJoinColumns() default {};
          UniqueConstraint[] uniqueConstraints() default {};
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="join-column" type="orm:join-column" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="inverse-join-column" type="orm:join-column" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="unique-constraint" type="orm:unique-constraint" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string"/>
    <xsd:attribute name="catalog" type="xsd:string"/>
    <xsd:attribute name="schema" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="many-to-many">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface ManyToMany {
          Class targetEntity() default void.class;
          CascadeType[] cascade() default {};
          FetchType fetch() default LAZY;
          String mappedBy() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="order-by" type="orm:order-by" 
                   minOccurs="0"/>
      <xsd:element name="map-key" type="orm:map-key" 
                   minOccurs="0"/>
      <xsd:element name="join-table" type="orm:join-table" 
                   minOccurs="0"/>
      <xsd:element name="cascade" type="orm:cascade-type" 
                   minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="target-entity" type="xsd:string"/>
    <xsd:attribute name="fetch" type="orm:fetch-type"/>
    <xsd:attribute name="mapped-by" type="xsd:string"/>
    <xsd:attribute name="join-fetch" type="orm:join-fetch-type">
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="generated-value">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface GeneratedValue {
          GenerationType strategy() default AUTO;
          String generator() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="strategy" type="orm:generation-type"/>
    <xsd:attribute name="generator" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="map-key">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface MapKey {
          String name() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:simpleType name="order-by">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface OrderBy {
          String value() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="inheritance">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface Inheritance {
          InheritanceType strategy() default SINGLE_TABLE;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="strategy" type="orm:inheritance-type"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:simpleType name="inheritance-type">
    <xsd:annotation>
      <xsd:documentation>

        public enum InheritanceType
          { SINGLE_TABLE, JOINED, TABLE_PER_CLASS};

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
      <xsd:enumeration value="SINGLE_TABLE"/>
      <xsd:enumeration value="JOINED"/>
      <xsd:enumeration value="TABLE_PER_CLASS"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:simpleType name="discriminator-value">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface DiscriminatorValue {
          String value();
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:string"/>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:simpleType name="discriminator-type">
    <xsd:annotation>
      <xsd:documentation>

        public enum DiscriminatorType { STRING, CHAR, INTEGER };

      </xsd:documentation>
    </xsd:annotation>
    <xsd:restriction base="xsd:token">
      <xsd:enumeration value="STRING"/>
      <xsd:enumeration value="CHAR"/>
      <xsd:enumeration value="INTEGER"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="primary-key-join-column">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
        public @interface PrimaryKeyJoinColumn {
          String name() default "";
          String referencedColumnName() default "";
          String columnDefinition() default "";
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string"/>
    <xsd:attribute name="referenced-column-name" type="xsd:string"/>
    <xsd:attribute name="column-definition" type="xsd:string"/>
  </xsd:complexType>

  <!-- **************************************************** -->

	<xsd:simpleType name="direction-type">
	  <xsd:annotation>
	    <xsd:documentation>
	      public enum Direction {
	        /**
	         * Input parameter
	         */
	        IN,
	
	        /**
	         * Output parameter
	         */
	        OUT,
	
	        /**
	         * Input and output parameter
	         */
	        IN_OUT,
	
	        /**
	         * Output cursor
	         */
	        OUT_CURSOR
	      }
	
	    </xsd:documentation>
	  </xsd:annotation>
	  <xsd:restriction base="xsd:token">
	    <xsd:enumeration value="IN"/>
	    <xsd:enumeration value="OUT"/>
	    <xsd:enumeration value="IN_OUT"/>
	    <xsd:enumeration value="OUT_CURSOR"/>
	  </xsd:restriction>
	</xsd:simpleType>

  <!-- **************************************************** -->

  <xsd:complexType name="discriminator-column">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface DiscriminatorColumn {
          String name() default "DTYPE";
          DiscriminatorType discriminatorType() default STRING;
          String columnDefinition() default "";
          int length() default 31;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string"/>
    <xsd:attribute name="discriminator-type" type="orm:discriminator-type"/>
    <xsd:attribute name="column-definition" type="xsd:string"/>
    <xsd:attribute name="length" type="xsd:int"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="embeddable">
    <xsd:annotation>
      <xsd:documentation>

        Defines the settings and mappings for embeddable objects. Is 
        allowed to be sparsely populated and used in conjunction with 
        the annotations. Alternatively, the metadata-complete attribute 
        can be used to indicate that no annotations are to be processed 
        in the class. If this is the case then the defaulting rules will 
        be recursively applied.

        @Target({TYPE}) @Retention(RUNTIME)
        public @interface Embeddable {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
      <xsd:element name="converter" type="orm:converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="type-converter" type="orm:type-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="object-type-converter" type="orm:object-type-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="struct-converter" type="orm:struct-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="change-tracking" type="orm:change-tracking"/>
      <xsd:element name="customizer" type="orm:customizer"/>
      <xsd:element name="attributes" type="orm:embeddable-attributes" 
                   minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="class" type="xsd:string" use="required"/>
    <xsd:attribute name="access" type="orm:access-type"/>
    <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="embeddable-attributes">
    <xsd:sequence>
      <xsd:element name="basic" type="orm:basic" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="transient" type="orm:transient" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="embedded">
    <xsd:annotation>
      <xsd:documentation>

        @Target({METHOD, FIELD}) @Retention(RUNTIME)
        public @interface Embedded {}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="attribute-override" type="orm:attribute-override" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="mapped-superclass">
    <xsd:annotation>
      <xsd:documentation>

        Defines the settings and mappings for a mapped superclass. Is 
        allowed to be sparsely populated and used in conjunction with 
        the annotations. Alternatively, the metadata-complete attribute 
        can be used to indicate that no annotations are to be processed 
        If this is the case then the defaulting rules will be recursively 
        applied.

        @Target(TYPE) @Retention(RUNTIME)
        public @interface MappedSuperclass{}

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
      <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
      <xsd:element name="exclude-default-listeners" type="orm:emptyType" 
                   minOccurs="0"/>
      <xsd:element name="exclude-superclass-listeners" type="orm:emptyType" 
                   minOccurs="0"/>
      <xsd:element name="entity-listeners" type="orm:entity-listeners" 
                   minOccurs="0"/>
      <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
      <xsd:element name="post-persist" type="orm:post-persist" 
                   minOccurs="0"/>
      <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
      <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
      <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
      <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
      <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
      <xsd:element name="converter" type="orm:converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="type-converter" type="orm:type-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="object-type-converter" type="orm:object-type-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="struct-converter" type="orm:struct-converter" 
                   minOccurs="0" maxOccurs="unbounded"/>
      <xsd:element name="optimistic-locking" type="orm:optimistic-locking" minOccurs="0"/>
      <xsd:element name="cache" type="orm:cache" minOccurs="0"/>
      <xsd:element name="change-tracking" type="orm:change-tracking"/>
      <xsd:element name="customizer" type="orm:customizer"/>
      <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="class" type="xsd:string" use="required"/>
    <xsd:attribute name="access" type="orm:access-type"/>
    <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
    <xsd:attribute name="read-only" type="xsd:boolean"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="sequence-generator">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
        public @interface SequenceGenerator {
          String name();
          String sequenceName() default "";
          int initialValue() default 1;
          int allocationSize() default 50;
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="sequence-name" type="xsd:string"/>
    <xsd:attribute name="initial-value" type="xsd:int"/>
    <xsd:attribute name="allocation-size" type="xsd:int"/>
  </xsd:complexType>

  <!-- **************************************************** -->

  <xsd:complexType name="table-generator">
    <xsd:annotation>
      <xsd:documentation>

        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
        public @interface TableGenerator {
          String name();
          String table() default "";
          String catalog() default "";
          String schema() default "";
          String pkColumnName() default "";
          String valueColumnName() default "";
          String pkColumnValue() default "";
          int initialValue() default 0;
          int allocationSize() default 50;
          UniqueConstraint[] uniqueConstraints() default {};
        }

      </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
      <xsd:element name="unique-constraint" type="orm:unique-constraint" 
                   minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="name" type="xsd:string" use="required"/>
    <xsd:attribute name="table" type="xsd:string"/>
    <xsd:attribute name="catalog" type="xsd:string"/>
    <xsd:attribute name="schema" type="xsd:string"/>
    <xsd:attribute name="pk-column-name" type="xsd:string"/>
    <xsd:attribute name="value-column-name" type="xsd:string"/>
    <xsd:attribute name="pk-column-value" type="xsd:string"/>
    <xsd:attribute name="initial-value" type="xsd:int"/>
    <xsd:attribute name="allocation-size" type="xsd:int"/>
  </xsd:complexType>

</xsd:schema>