JPA 3.1 (ORM 3.1 implementation) (#1425)

JPA 3.1 (ORM 3.1 implementation)
with updated JPA Modelgen tests

Signed-off-by: Radek Felcman <radek.felcman@oracle.com>
diff --git a/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java b/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java
index f7abc4e..3557d87 100644
--- a/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java
+++ b/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2022 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -27,6 +27,8 @@
 //       - 494610: Session Properties map should be Map<String, Object>
 //     10/09/2017-2.7 Lukas Jungmann
 //       - 521954: Eclipselink 2.7 is not able to parse ORM XML files using the 2.2 schema
+//     02/10/2022-4.0 Oracle
+//       - JPA 3.1 UUID Support
 package org.eclipse.persistence.internal.jpa.modelgen.objects;
 
 import static org.eclipse.persistence.internal.jpa.metadata.MetadataConstants.JPA_EMBEDDABLE;
@@ -281,23 +283,28 @@
             addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getEclipseLinkOrmProject());
         } catch (XMLMarshalException e) {
             try {
-                // Try Persistence 3.0 project
-                addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm3_0Project());
-            } catch (XMLMarshalException xe) {
+                // Try Persistence 3.1 project
+                addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm3_1Project());
+            } catch (XMLMarshalException e31) {
                 try {
-                    // Try JPA 2.2 project
-                    addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm2_2Project());
-                } catch (XMLMarshalException xme) {
+                    // Try Persistence 3.0 project
+                    addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm3_0Project());
+                } catch (XMLMarshalException e30) {
                     try {
-                        // Try JPA 2.1 project
-                        addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm2_1Project());
-                    } catch (XMLMarshalException ee) {
+                        // Try JPA 2.2 project
+                        addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm2_2Project());
+                    } catch (XMLMarshalException e22) {
                         try {
-                            // Try JPA 2.0 project
-                            addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm2_0Project());
-                        } catch (XMLMarshalException eee) {
-                            // Try JPA 1.0 project (don't catch exceptions at this point)
-                            addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm1_0Project());
+                            // Try JPA 2.1 project
+                            addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm2_1Project());
+                        } catch (XMLMarshalException e21) {
+                            try {
+                                // Try JPA 2.0 project
+                                addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm2_0Project());
+                            } catch (XMLMarshalException e20) {
+                                // Try JPA 1.0 project (don't catch exceptions at this point)
+                                addXMLEntityMappings(mappingFile, XMLEntityMappingsReader.getOrm1_0Project());
+                            }
                         }
                     }
                 }
diff --git a/jpa/org.eclipse.persistence.jpa.modelgen/src/test/java/org/eclipse/persistence/jpa/test/modelgen/TestProcessor.java b/jpa/org.eclipse.persistence.jpa.modelgen/src/test/java/org/eclipse/persistence/jpa/test/modelgen/TestProcessor.java
index 6abe984..8aab66c 100644
--- a/jpa/org.eclipse.persistence.jpa.modelgen/src/test/java/org/eclipse/persistence/jpa/test/modelgen/TestProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa.modelgen/src/test/java/org/eclipse/persistence/jpa/test/modelgen/TestProcessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2022 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -64,88 +64,37 @@
 
     @Test
     public void testProc() throws Exception {
-        TestFO entity = new TestFO("org.Sample",
-                "package org; import jakarta.persistence.Entity; @Entity public class Sample { public  Sample() {} public int getX() {return 1;} interface A {}}");
-        TestFO nonSC = new TestFO("some.IF",
-                "package some; public class IF { public IF() {}}");
-        TestFO nonAnn = new TestFO("custom.Ann",
-                "package custom; public @interface Ann { }");
-        TestFO nonExt = new TestFO("external.Cls",
-                "package external; public class Cls { public Cls(){}}");
-        TestFO nonEntity = new TestFO("org.NotE",
-                "package org; import jakarta.persistence.Entity; public class NotE extends some.IF { public  NotE() {} @custom.Ann public external.Cls getW() {return new Object();}}");
-        TestFO generated8 = new TestFO("org.Gen8",
-                "package org; import jakarta.annotation.Generated; @Generated(\"com.example.Generator\") public class Gen8 { public  Gen8() {} public int getY() {return 42;}}");
-        TestFO generated9 = new TestFO("org.Gen9",
-                "package org; @javax.annotation.processing.Generated(\"com.example.Generator\") public class Gen9 { public  Gen9() {} public int getZ() {return 9*42;}}");
-
-        Result result = runProject("testProc",
-                getJavacOptions("-Aeclipselink.logging.level.processor=OFF"),
-                Arrays.asList(entity, nonSC, nonAnn, nonExt, nonEntity, generated8, generated9));
-
-        File outputFile = new File(result.srcOut, "org/Sample_.java");
-        Assert.assertTrue("Model file not generated", outputFile.exists());
-        Assert.assertTrue(Files.lines(outputFile.toPath()).anyMatch(s -> s.contains("@StaticMetamodel(Sample.class)")));
+        testProc("testProc3030", PXML30, OXML30);
+        testProc("testProc3031", PXML30, OXML31);
     }
 
     @Test
     public void testGenerateComment() throws Exception {
-        TestFO entity = new TestFO("org.Sample",
-                "package org; import jakarta.persistence.Entity; @Entity public class Sample { public  Sample() {} public int getX() {return 1;} interface A {}}");
-
-        Result result = runProject("testGenerateComment",
-            getJavacOptions("-A" + CanonicalModelProperties.CANONICAL_MODEL_GENERATE_COMMENTS + "=false",
-                    "-Aeclipselink.logging.level.processor=OFF"),
-            Arrays.asList(entity));
-
-        File outputFile = new File(result.srcOut, "org/Sample_.java");
-        Assert.assertTrue("Model file not generated", outputFile.exists());
-        Assert.assertTrue(Files.lines(outputFile.toPath()).noneMatch(s -> s.contains("comments=")));
-        Assert.assertTrue("Compilation failed", result.success);
+        testGenerateComment("testGenerateComment3030", PXML30, OXML30);
+        testGenerateComment("testGenerateComment3031", PXML30, OXML31);
     }
 
     @Test
     public void testGenerate() throws Exception {
-        TestFO entity = new TestFO("org.Sample",
-                "package org; import jakarta.persistence.Entity; @Entity public class Sample { public  Sample() {} public int getX() {return 1;} interface A {}}");
-
-        Result result = runProject("testGenerate",
-            getJavacOptions("-A" + CanonicalModelProperties.CANONICAL_MODEL_GENERATE_GENERATED + "=false",
-                    "-Aeclipselink.logging.level.processor=OFF"),
-            Arrays.asList(entity));
-
-        File outputFile = new File(result.srcOut, "org/Sample_.java");
-        Assert.assertTrue("Model file not generated", outputFile.exists());
-        Assert.assertTrue(Files.lines(outputFile.toPath()).noneMatch(s -> s.contains("Generated")));
-        Assert.assertTrue("Compilation failed", result.success);
+        testGenerate("testGenerate3030", PXML30, OXML30);
+        testGenerate("testGenerate3031", PXML30, OXML31);
     }
 
     @Test
     public void testTypeUse() throws Exception {
-        TestFO entity = new TestFO("org.Ent",
-                "package org; @jakarta.persistence.Entity public class Ent { @org.ann.NotNull private byte[] bytes;}");
-        TestFO ann = new TestFO("org.ann.NotNull",
-                "package org.ann; @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE) public @interface NotNull {}");
-
-        Result result = runProject("testTypeUse",
-            getJavacOptions("-Aeclipselink.logging.level.processor=OFF"),
-            Arrays.asList(entity, ann));
-
-        File outputFile = new File(result.srcOut, "org/Ent_.java");
-        Assert.assertTrue("Model file not generated", outputFile.exists());
-        Assert.assertTrue(Files.lines(outputFile.toPath()).noneMatch(s -> s.contains("NotNull")));
-        Assert.assertTrue("Compilation failed", result.success);
+        testTypeUse("testTypeUse3030", PXML30, OXML30);
+        testTypeUse("testTypeUse3031", PXML30, OXML31);
     }
 
     @Test
     public void testProcessorLoggingOffFromCmdLine() throws Exception {
-        verifyLogging("testProcessorLoggingOffFromCmdLine", PXML, false,
+        verifyLogging("testProcessorLoggingOffFromCmdLine", PXML30, false,
                 "-Aeclipselink.logging.level.processor=OFF");
     }
 
     @Test
     public void testGlobalLoggingOffFromCmdLine() throws Exception {
-        verifyLogging("testGlobalLoggingOffFromCmdLine", PXML, false,
+        verifyLogging("testGlobalLoggingOffFromCmdLine", PXML30, false,
                 "-Aeclipselink.logging.level=OFF");
     }
 
@@ -167,13 +116,13 @@
 
     @Test
     public void testProcessorLoggingFinestFromCmdLine() throws Exception {
-        verifyLogging("testProcessorLoggingFinestFromCmdLine", PXML, true,
+        verifyLogging("testProcessorLoggingFinestFromCmdLine", PXML30, true,
                 "-Aeclipselink.logging.level.processor=FINEST");
     }
 
     @Test
     public void testGlobalLoggingFinestFromCmdLine() throws Exception {
-        verifyLogging("testGlobalLoggingFinestFromCmdLine", PXML, true,
+        verifyLogging("testGlobalLoggingFinestFromCmdLine", PXML30, true,
                 "-Aeclipselink.logging.level=FINEST");
     }
 
@@ -191,6 +140,77 @@
         verifyLogging("testGlobalLoggingFinestFromPU", pu, true);
     }
 
+    private void testProc(String name, String pxml, String oxml) throws Exception {
+        TestFO entity = new TestFO("org.Sample",
+                "package org; import jakarta.persistence.Entity; @Entity public class Sample { public  Sample() {} public int getX() {return 1;} interface A {}}");
+        TestFO nonSC = new TestFO("some.IF",
+                "package some; public class IF { public IF() {}}");
+        TestFO nonAnn = new TestFO("custom.Ann",
+                "package custom; public @interface Ann { }");
+        TestFO nonExt = new TestFO("external.Cls",
+                "package external; public class Cls { public Cls(){}}");
+        TestFO nonEntity = new TestFO("org.NotE",
+                "package org; import jakarta.persistence.Entity; public class NotE extends some.IF { public  NotE() {} @custom.Ann public external.Cls getW() {return new Object();}}");
+        TestFO generated8 = new TestFO("org.Gen8",
+                "package org; import jakarta.annotation.Generated; @Generated(\"com.example.Generator\") public class Gen8 { public  Gen8() {} public int getY() {return 42;}}");
+        TestFO generated9 = new TestFO("org.Gen9",
+                "package org; @javax.annotation.processing.Generated(\"com.example.Generator\") public class Gen9 { public  Gen9() {} public int getZ() {return 9*42;}}");
+
+        Result result = runProject(name,
+                getJavacOptions("-Aeclipselink.logging.level.processor=OFF"),
+                Arrays.asList(entity, nonSC, nonAnn, nonExt, nonEntity, generated8, generated9), pxml, oxml);
+
+        File outputFile = new File(result.srcOut, "org/Sample_.java");
+        Assert.assertTrue("Model file not generated", outputFile.exists());
+        Assert.assertTrue(Files.lines(outputFile.toPath()).anyMatch(s -> s.contains("@StaticMetamodel(Sample.class)")));
+    }
+
+    private void testGenerateComment(String name, String pxml, String oxml) throws Exception {
+        TestFO entity = new TestFO("org.Sample",
+                "package org; import jakarta.persistence.Entity; @Entity public class Sample { public  Sample() {} public int getX() {return 1;} interface A {}}");
+
+        Result result = runProject(name,
+                getJavacOptions("-A" + CanonicalModelProperties.CANONICAL_MODEL_GENERATE_COMMENTS + "=false",
+                        "-Aeclipselink.logging.level.processor=OFF"),
+                Arrays.asList(entity), pxml, oxml);
+
+        File outputFile = new File(result.srcOut, "org/Sample_.java");
+        Assert.assertTrue("Model file not generated", outputFile.exists());
+        Assert.assertTrue(Files.lines(outputFile.toPath()).noneMatch(s -> s.contains("comments=")));
+        Assert.assertTrue("Compilation failed", result.success);
+    }
+
+    private void testGenerate(String name, String pxml, String oxml) throws Exception {
+        TestFO entity = new TestFO("org.Sample",
+                "package org; import jakarta.persistence.Entity; @Entity public class Sample { public  Sample() {} public int getX() {return 1;} interface A {}}");
+
+        Result result = runProject(name,
+                getJavacOptions("-A" + CanonicalModelProperties.CANONICAL_MODEL_GENERATE_GENERATED + "=false",
+                        "-Aeclipselink.logging.level.processor=OFF"),
+                Arrays.asList(entity), pxml, oxml);
+
+        File outputFile = new File(result.srcOut, "org/Sample_.java");
+        Assert.assertTrue("Model file not generated", outputFile.exists());
+        Assert.assertTrue(Files.lines(outputFile.toPath()).noneMatch(s -> s.contains("Generated")));
+        Assert.assertTrue("Compilation failed", result.success);
+    }
+
+    public void testTypeUse(String name, String pxml, String oxml) throws Exception {
+        TestFO entity = new TestFO("org.Ent",
+                "package org; @jakarta.persistence.Entity public class Ent { @org.ann.NotNull private byte[] bytes;}");
+        TestFO ann = new TestFO("org.ann.NotNull",
+                "package org.ann; @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE) public @interface NotNull {}");
+
+        Result result = runProject(name,
+                getJavacOptions("-Aeclipselink.logging.level.processor=OFF"),
+                Arrays.asList(entity, ann), pxml, oxml);
+
+        File outputFile = new File(result.srcOut, "org/Ent_.java");
+        Assert.assertTrue("Model file not generated", outputFile.exists());
+        Assert.assertTrue(Files.lines(outputFile.toPath()).noneMatch(s -> s.contains("NotNull")));
+        Assert.assertTrue("Compilation failed", result.success);
+    }
+
     private List<String> getJavacOptions(String... opts) {
         List<String> result = new ArrayList<>();
         String systemOpts = System.getProperty("test.junit.jvm.modules");
@@ -253,7 +273,7 @@
         }
     }
 
-    private Result runProject(String name, List<String> options, List<JavaFileObject> sources) throws Exception {
+    private Result runProject(String name, List<String> options, List<JavaFileObject> sources, String pxmlStr, String oxmlStr) throws Exception {
                 File runDir = new File(System.getProperty("run.dir"), name);
         File srcOut = new File(runDir, "src");
         srcOut.mkdirs();
@@ -262,13 +282,13 @@
         File pxml = new File(cpDir, "META-INF/persistence.xml");
         pxml.getParentFile().mkdirs();
         try (BufferedWriter writer = Files.newBufferedWriter(pxml.toPath(), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)) {
-            writer.write(PXML, 0, PXML.length());
+            writer.write(pxmlStr, 0, pxmlStr.length());
         } catch (IOException x) {
             throw x;
         }
         File oxml = new File(cpDir, "META-INF/orm.xml");
         try (BufferedWriter writer = Files.newBufferedWriter(oxml.toPath(), StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)) {
-            writer.write(OXML, 0, OXML.length());
+            writer.write(oxmlStr, 0, oxmlStr.length());
         } catch (IOException x) {
             throw x;
         }
@@ -322,7 +342,7 @@
         }
     }
 
-    private static final String PXML = "<persistence xmlns=\"https://jakarta.ee/xml/ns/persistence\"\n" +
+    private static final String PXML30 = "<persistence xmlns=\"https://jakarta.ee/xml/ns/persistence\"\n" +
             "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
             "  xsi:schemaLocation=\"https://jakarta.ee/xml/ns/persistence\n" +
             "    https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd\"\n" +
@@ -335,12 +355,18 @@
             "     </persistence-unit>\n" +
             "</persistence>";
 
-    private static final String OXML = "<entity-mappings xmlns=\"https://jakarta.ee/xml/ns/persistence/orm\"\n" +
+    private static final String OXML30 = "<entity-mappings xmlns=\"https://jakarta.ee/xml/ns/persistence/orm\"\n" +
 "             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
 "             xsi:schemaLocation=\"https://jakarta.ee/xml/ns/persistence/orm https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd\"\n" +
 "             version=\"3.0\">" +
             "</entity-mappings>";
 
+    private static final String OXML31 = "<entity-mappings xmlns=\"https://jakarta.ee/xml/ns/persistence/orm\"\n" +
+            "             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+            "             xsi:schemaLocation=\"https://jakarta.ee/xml/ns/persistence/orm https://jakarta.ee/xml/ns/persistence/orm/orm_3_1.xsd\"\n" +
+            "             version=\"3.1\">" +
+            "</entity-mappings>";
+
     private static final String PXML_LOG_BEG =
             "<persistence xmlns=\"http://xmlns.jcp.org/xml/ns/persistence\"\n" +
             "  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java
index d235ecb..d4f7f29 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2022 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 1998, 2018 IBM and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -27,6 +27,9 @@
 //       - 338610: JPA 2.1 Functionality for Java EE 7 (JSR-338)
 //     09/06/2017-2.7 Jody Grassel
 //       - 521954: Eclipselink is not able to parse ORM XML files using the 2.2 schema
+//     02/10/2022-4.0 Oracle
+//       - JPA 3.1 UUID Support
+
 package org.eclipse.persistence.internal.jpa.metadata.xml;
 
 import java.io.IOException;
@@ -75,6 +78,8 @@
     public static final String ORM_2_2_NAMESPACE = "http://xmlns.jcp.org/xml/ns/persistence/orm";
     public static final String ORM_3_0_XSD = "org/eclipse/persistence/jpa/orm_3_0.xsd";
     public static final String ORM_3_0_NAMESPACE = "https://jakarta.ee/xml/ns/persistence/orm";
+    public static final String ORM_3_1_XSD = "org/eclipse/persistence/jpa/orm_3_1.xsd";
+    public static final String ORM_3_1_NAMESPACE = "https://jakarta.ee/xml/ns/persistence/orm";
     public static final String ECLIPSELINK_ORM_XSD = "org/eclipse/persistence/jpa/eclipselink_orm_2_5.xsd";
     public static final String ECLIPSELINK_ORM_NAMESPACE = "http://www.eclipse.org/eclipselink/xsds/persistence/orm";
 
@@ -83,6 +88,7 @@
     private static XMLContext m_orm2_1Project;
     private static XMLContext m_orm2_2Project;
     private static XMLContext m_orm3_0Project;
+    private static XMLContext m_orm3_1Project;
     private static XMLContext m_eclipseLinkOrmProject;
 
     private static Schema m_orm1_0Schema;
@@ -90,6 +96,7 @@
     private static Schema m_orm2_1Schema;
     private static Schema m_orm2_2Schema;
     private static Schema m_orm3_0Schema;
+    private static Schema m_orm3_1Schema;
     private static Schema m_eclipseLinkOrmSchema;
 
     private XMLEntityMappingsReader() {
@@ -146,11 +153,16 @@
                 if (validateSchema) {
                     context[1] = getOrm2_2Schema();
                 }
-            } else {
+            } else if (contentHandler.getVersion().contains("3.0")) {
                 context[0] = getOrm3_0Project();
                 if (validateSchema) {
                     context[1] = getOrm3_0Schema();
                 }
+            } else {
+                context[0] = getOrm3_1Project();
+                if (validateSchema) {
+                    context[1] = getOrm3_1Schema();
+                }
             }
         }
 
@@ -300,6 +312,28 @@
     }
 
     /**
+     * @return the JPA 3.1 orm project.
+     */
+    public static XMLContext getOrm3_1Project() {
+        if (m_orm3_1Project == null) {
+            m_orm3_1Project = new XMLContext(new XMLEntityMappingsMappingProject(ORM_3_1_NAMESPACE, ORM_3_1_XSD));
+        }
+
+        return m_orm3_1Project;
+    }
+
+    /**
+     * @return the JPA 3.1 orm schema.
+     */
+    public static Schema getOrm3_1Schema() throws IOException, SAXException {
+        if (m_orm3_1Schema == null) {
+            m_orm3_1Schema = loadLocalSchema(ORM_3_1_XSD);
+        }
+
+        return m_orm3_1Schema;
+    }
+
+    /**
      * Free the project and schema objects to avoid holding onto the memory.
      * This can be done post-deployment to conserve memory.
      */
@@ -309,6 +343,7 @@
         m_orm2_1Project = null;
         m_orm2_2Project = null;
         m_orm3_0Project = null;
+        m_orm3_1Project = null;
         m_eclipseLinkOrmProject = null;
 
         m_orm1_0Schema = null;
@@ -316,6 +351,7 @@
         m_orm2_1Schema = null;
         m_orm2_2Schema = null;
         m_orm3_0Schema = null;
+        m_orm3_1Schema = null;
         m_eclipseLinkOrmSchema = null;
     }
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/eclipselink_orm_3_0.xsd b/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/eclipselink_orm_3_0.xsd
index 5506ac7..e70af45 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/eclipselink_orm_3_0.xsd
+++ b/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/eclipselink_orm_3_0.xsd
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-    Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
+    Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved.
 
     This program and the accompanying materials are made available under the
     terms of the Eclipse Public License v. 2.0 which is available at
@@ -39,7 +39,7 @@
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   elementFormDefault="qualified"
   attributeFormDefault="unqualified"
-  version="2.5">
+  version="3.0">
 
   <xsd:annotation>
     <xsd:documentation>
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/eclipselink_orm_3_1.xsd b/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/eclipselink_orm_3_1.xsd
new file mode 100644
index 0000000..9b09604
--- /dev/null
+++ b/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/eclipselink_orm_3_1.xsd
@@ -0,0 +1,6247 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
+
+    This program and the accompanying materials are made available under the
+    terms of the Eclipse Public License v. 2.0 which is available at
+    http://www.eclipse.org/legal/epl-2.0,
+    or the Eclipse Distribution License v. 1.0 which is available at
+    http://www.eclipse.org/org/documents/edl-v10.php.
+
+    SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+
+-->
+
+<!--
+Contributors:
+    Oracle - initial API and implementation from Oracle TopLink
+    tware - update version number to 2.0
+    12/2/2009-2.1 Guy Pelletier
+       - 296289: Add current annotation metadata support on mapped superclasses to EclipseLink-ORM.XML Schema
+       - 296612: Add current annotation only metadata support of return insert/update to the EclipseLink-ORM.XML Schema
+       - formatted to match orm_2_0.xsd so that users can easily compare the two schemas
+    5/4/2010-2.1 Guy Pelletier
+       - 227219: Expand EclipseLink-ORM.XML schema functionality for 2.1 release  (update version to 2.1)
+    6/14/2010-2.2 Guy Pelletier
+       - 247078: eclipselink-orm.xml schema should allow lob and enumerated on version and id mappings (update version to 2.2)
+    10/15/2010-2.2 Guy Pelletier
+      - 322008: Improve usability of additional criteria applied to queries at the session/EM
+    03/23/2011-2.3 Guy Pelletier
+      - 337323: Multi-tenant with shared schema support (part 1)
+    02/13/2013-2.5 Guy Pelletier
+      - 397772: JPA 2.1 Entity Graph Support (XML support)
+    02/10/2022-4.0 Oracle
+      - JPA 3.1 UUID Support
+-->
+
+<!-- Java Persistence API object-relational mapping file schema -->
+<xsd:schema targetNamespace="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
+  xmlns:orm="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  elementFormDefault="qualified"
+  attributeFormDefault="unqualified"
+  version="3.1">
+
+  <xsd:annotation>
+    <xsd:documentation>
+      @(#)eclipselink_orm_3_1.xsd 3.1  ##DATE##
+    </xsd:documentation>
+  </xsd:annotation>
+
+  <xsd:annotation>
+     <xsd:documentation><![CDATA[
+
+       This is the XML Schema for the native Eclipselink XML mapping file
+       The file may be named "META-INF/eclipselink-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.
+       Object/relational mapping files must indicate the object/relational
+       mapping file schema by using the persistence namespace:
+
+       http://www.eclipse.org/eclipselink/xsds/persistence/orm
+
+       and indicate the version of the schema by using the version element as shown below:
+
+       <entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm
+       eclipselink_orm_3_1.xsd
+       version="3.1">
+       ...
+       </entity-mappings>
+
+     ]]></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:simpleType name="supported-versions-type">
+    <xsd:restriction base="orm:versionType">
+      <xsd:enumeration value="3.0"/>
+      <xsd:enumeration value="3.1"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="access-methods">
+    <xsd:annotation>
+      <xsd:documentation>
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="get-method" type="xsd:string" use="required"/>
+    <xsd:attribute name="set-method" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="additional-criteria">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * An additional criteria can be specified at the Entity or MappedSuperclass
+         * level. When specified at the mapped superclass level, it applies to all
+         * inheriting entities unless those entities define their own additional
+         * criteria, at which point the additional criteria from the mapped superclass
+         * is ignored.
+         *
+         * The additional criteria supports any valid JPQL string and must use 'this'
+         * as an alias to form your additional criteria. E.G.,
+         *
+         * @Entity
+         * @AdditionalCriteria("this.nut.size = :NUT_SIZE and this.nut.color = :NUT_COLOR")
+         * public class Bolt {...}
+         *
+         * Additional criteria parameters are also accepted and are set through
+         * properties on the entity manager factory, or on an entity manager. When set
+         * on the entity manager, the properties must be set before any query execution
+         * and should not be changed for the life span of that entity manager.
+         *
+         * Properties set on the entity manager will override those similarly named
+         * properties set on the entity manager factory.
+         *
+         * Additional criteria is not supported with any native queries.
+         *
+         * @author Guy Pelletier
+         * @since EclipseLink 2.2
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface AdditionalCriteria {
+            /**
+             * (Required) The JPQL fragment to use as the additional criteria.
+             */
+            String value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="criteria" type="xsd:string"/>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="cache">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * The Cache annotation is used to set an
+         * org.eclipse.persistence.descriptors.invalidation.CacheInvalidationPolicy
+         * which sets objects in EclipseLink's identity maps to be invalid
+         * following given rules. By default in EclipseLink, objects do not
+         * expire in the cache. Several different policies are available to
+         * allow objects to expire.
+         *
+         * @see org.eclipse.persistence.annotations.CacheType
+         *
+         * A Cache anotation may be defined on an Entity or MappedSuperclass.
+         * In the case of inheritance, a Cache annotation should only be defined
+         * on the root of the inheritance hierarchy.
+         */
+        @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) Controls the level of caching this Entity will use.
+          * The default is CacheIsolationType.SHARED which has EclipseLink
+          * Caching all Entities in the Shared Cache.
+          * @see org.eclipse.persistence.config.CacheIsolationType
+          */
+          CacheIsolationType isolation() default SHARED;
+
+          /**
+           * (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;
+
+          /**
+           * (Optional) The database change notification mode.
+           * Note that database event listener must also be configured for the persistence unit/session.
+           */
+          DatabaseChangeNotificationType databaseChangeNotificationType() default DatabaseChangeNotificationType.INVALIDATE;
+        }
+
+      </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="isolation" type="orm:cache-isolation-type"/>
+    <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:attribute name="database-change-notification-type" type="orm:database-change-notification-type"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="cache-interceptor">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface CacheInterceptor {
+          Class value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="cache-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * The CacheType enum is used with the Cache annotation for a
+         * persistent class. It defines the type of IdentityMap/Cache used for
+         * the class. By default the SOFT_WEAK cache type is used.
+         *
+         * @see org.eclipse.persistence.annotations.Cache
+         */
+        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:simpleType name="cache-isolation-type">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * Options for how Entity instances should be shared within an EclipseLink Persistence Unit / ServerSession
+         * @see ClassDescriptor#setCacheIsolationType(CacheIsolationType)
+         * @author Gordon Yorke
+         * @since EclipseLink 2.2
+         */
+        public enum CacheIsolationType {
+
+         /**
+          * Entity instances will be cached within the EntityManagerFactory/ServerSession level.
+          * Any user queries for shared cache instances (ie Read-Only query hint) will return an Entity
+          * instance that may be shared by multiple clients.
+          *
+          * This setting is the default isolation level.
+          */
+         SHARED,
+
+         /**
+          * Entity state information will be cached in the shared cache but Entity
+          * instances will not be shared. Any user queries for shared cache instances
+          * (ie Read-Only query hint) will return a new Entity instance with the cached state.
+          * This will ensure the instance is <i>protected</i> from any concurrent
+          * state change.
+          */
+         PROTECTED,
+
+         /**
+          * The Entity and its data is not stored in the shared cache but is
+          * <i>isolated</i> to the Persistence Context/UnitOfWork or
+          * IsolatedClientSession. This setting effectively disables second level
+          * caching for this entity and should be used when users do not want caching for
+          * a particular Entity.
+          */
+         ISOLATED;
+
+        }
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="SHARED"/>
+      <xsd:enumeration value="PROTECTED"/>
+      <xsd:enumeration value="ISOLATED"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="cache-coordination-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * An enum that is used within the Cache annotation.
+         *
+         * @see org.eclipse.persistence.annotations.Cache
+         */
+        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:simpleType name="database-change-notification-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Configures what type of database change notification an entity/descriptor should use.
+         * This is only relevant if the persistence unit/session has been configured with a DatabaseEventListener,
+         * such as the OracleChangeNotificationListener that receives database change events.
+         * This allows for the EclipseLink cache to be invalidated or updated from database changes.
+         *
+         * @see Cache#databaseChangeNotificationType()
+         * @see org.eclipse.persistence.descriptors.CachePolicy#setDatabaseChangeNotificationType(DatabaseChangeNotificationType)
+         * @author James Sutherland
+         * @since EclipseLink 2.4
+         */
+        public enum DatabaseChangeNotificationType {
+            /**
+             * No database change events will be processed.
+             */
+            NONE,
+
+            /**
+             * Invalidates the EclipseLink cache when a database change event is received for an object.
+             * This requires a DatabaseEventListener to be configured with the persistence unit or session.
+             * This requires that the database change can be determine to affect the object, some database change events,
+             * such as the OracleChangeNotificationListener (Oracle DCN/QCN) only give the ROWID, so changes to secondary
+             * table or relationships may not be able to be determined to affect and object unless its version is also changed.
+             */
+            INVALIDATE
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="NONE"/>
+      <xsd:enumeration value="INVALIDATE"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="change-tracking">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * The ChangeTracking annotation is used to specify the
+         * org.eclipse.persistence.descriptors.changetracking.ObjectChangePolicy
+         * which computes changes sets for EclipseLink's UnitOfWork commit
+         * process. An ObjectChangePolicy is stored on an Entity's descriptor.
+         *
+         * A ChangeTracking annotation may be specified on an Entity,
+         * MappedSuperclass or Embeddable.
+         */
+        @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"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="change-tracking-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * An enum that is used within the ChangeTracking annotation.
+         */
+        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="customizer">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * The Customizer annotation is used to specify a class that implements
+         * the org.eclipse.persistence.config.DescriptorCustomizer
+         * interface and is to run against an enetity's class descriptor after all
+         * metadata processing has been completed.
+         *
+         * The Customizer annotation may be defined on an Entity, MappedSuperclass
+         * or Embeddable class. In the case of inheritance, a Customizer is not
+         * inherited from its parent classes.
+         */
+        @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:simpleType name="direction-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * An enum that is used within the StoredProcedureParameter annotation.
+         * It is used to specify the direction of the stored procedure
+         * parameters of a named stored procedure query.
+         */
+        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:simpleType name="parameter-mode">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum ParameterMode { IN, INOUT, OUT, REF_CURSOR };
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="IN"/>
+      <xsd:enumeration value="OUT"/>
+      <xsd:enumeration value="INOUT"/>
+      <xsd:enumeration value="REF_CURSOR"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:element name="entity-mappings">
+    <xsd:complexType>
+      <xsd:annotation>
+        <xsd:documentation>
+
+        The entity-mappings element is the root element of a 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, named-native-query, or
+        result-set-mapping 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"/>
+        <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+        <xsd:element name="tenant-discriminator-column" type="orm:tenant-discriminator-column" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:choice minOccurs="0" maxOccurs="unbounded">
+            <xsd:element name="converter" type="orm:mixed-converter"/>
+            <xsd:element name="type-converter" type="orm:type-converter"/>
+            <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+            <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+            <xsd:element name="struct-converter" type="orm:struct-converter"/>
+            <xsd:element name="sequence-generator" type="orm:sequence-generator"/>
+            <xsd:element name="table-generator" type="orm:table-generator"/>
+            <xsd:element name="uuid-generator" type="orm:uuid-generator"/>
+            <xsd:element name="partitioning" type="orm:partitioning"/>
+            <xsd:element name="replication-partitioning" type="orm:replication-partitioning"/>
+            <xsd:element name="round-robin-partitioning" type="orm:round-robin-partitioning"/>
+            <xsd:element name="pinned-partitioning" type="orm:pinned-partitioning"/>
+            <xsd:element name="range-partitioning" type="orm:range-partitioning"/>
+            <xsd:element name="value-partitioning" type="orm:value-partitioning"/>
+            <xsd:element name="hash-partitioning" type="orm:hash-partitioning"/>
+            <xsd:element name="union-partitioning" type="orm:union-partitioning"/>
+            <xsd:element name="named-query" type="orm:named-query"/>
+            <xsd:element name="named-native-query" type="orm:named-native-query"/>
+            <xsd:element name="named-stored-procedure-query" type="orm:named-stored-procedure-query"/>
+            <xsd:element name="named-stored-function-query" type="orm:named-stored-function-query"/>
+            <xsd:element name="named-plsql-stored-procedure-query" type="orm:named-plsql-stored-procedure-query"/>
+            <xsd:element name="named-plsql-stored-function-query" type="orm:named-plsql-stored-function-query"/>
+            <xsd:element name="oracle-object" type="orm:oracle-object"/>
+            <xsd:element name="oracle-array" type="orm:oracle-array"/>
+            <xsd:element name="plsql-record" type="orm:plsql-record"/>
+            <xsd:element name="plsql-table" type="orm:plsql-table"/>
+            <xsd:element name="sql-result-set-mapping" type="orm:sql-result-set-mapping"/>
+            <xsd:element name="mapped-superclass" type="orm:mapped-superclass"/>
+            <xsd:element name="entity" type="orm:entity"/>
+            <xsd:element name="embeddable" type="orm:embeddable"/>
+      </xsd:choice>
+      </xsd:sequence>
+      <xsd:attribute name="version" type="orm:supported-versions-type" default="3.1" use="optional"/>
+    </xsd:complexType>
+  </xsd:element>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="existence-type">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * The ExistenceChecking annotation is used to specify the type of
+         * checking EclipseLink should use when updating entities.
+         *
+         * An existence-checking specification is supported on an Entity or
+         * MappedSuperclass annotation.
+         */
+        public @interface ExistenceChecking {
+
+          /**
+           * (Optional) Set the existence check for determining
+           * if an insert or update should occur for an object.
+           */
+          ExistenceType value() default CHECK_CACHE;
+        }
+
+        /**
+         * Assume that if the objects primary key does not include null and
+         * it is in the cache, then it must exist.
+         */
+        CHECK_CACHE,
+
+        /**
+         * Perform does exist check on the database.
+         */
+        CHECK_DATABASE,
+
+        /**
+         * Assume that if the objects primary key does not include null then
+         * it must exist. This may be used if the application guarantees or
+         * does not care about the existence check.
+         */
+        ASSUME_EXISTENCE,
+
+        /**
+         * Assume that the object does not exist. This may be used if the
+         * application guarantees or does not care about the existence check.
+         * This will always force an insert to be called.
+         */
+        ASSUME_NON_EXISTENCE
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <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="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,
+        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="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="xml-mapping-metadata-complete" type="orm:emptyType"
+                   minOccurs="0"/>
+      <xsd:element name="exclude-default-mappings" 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="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, secondary tables, join
+            tables, collection tables, sequence generators, and table
+            generators that apply to the persistence unit
+        catalog - Used as the catalog for all tables, secondary tables, join
+            tables, collection tables, sequence generators, and table
+            generators that apply to the persistence unit
+        delimited-identifiers - Used to treat database identifiers as
+            delimited identifiers.
+        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 all 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="description" 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="delimited-identifiers" type="orm:emptyType"
+                     minOccurs="0"/>
+        <xsd:element name="access" type="orm:access-type"
+                     minOccurs="0"/>
+        <xsd:element name="access-methods" type="orm:access-methods"
+                     minOccurs="0"/>
+        <xsd:element name="cascade-persist" type="orm:emptyType"
+                     minOccurs="0"/>
+        <xsd:element name="tenant-discriminator-column" type="orm:tenant-discriminator-column"
+                     minOccurs="0" maxOccurs="unbounded"/>
+        <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="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="multitenant" type="orm:multitenant" minOccurs="0"/>
+      <xsd:element name="additional-criteria" type="orm:additional-criteria" minOccurs="0"/>
+      <xsd:element name="customizer" type="orm:customizer" minOccurs="0"/>
+      <xsd:element name="change-tracking" type="orm:change-tracking" minOccurs="0"/>
+      <xsd:choice>
+          <xsd:sequence>
+              <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="struct" type="orm:struct" minOccurs="0"/>
+              <xsd:sequence>
+                  <xsd:element name="primary-key-join-column" type="orm:primary-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
+                  <xsd:element name="primary-key-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+              </xsd:sequence>
+          </xsd:sequence>
+          <xsd:element name="no-sql" type="orm:no-sql" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:element name="cascade-on-delete" type="xsd:boolean" minOccurs="0"/>
+      <xsd:element name="index" type="orm:eclipselink-index" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
+      <xsd:element name="primary-key" type="orm:primary-key" minOccurs="0"/>
+      <xsd:element name="inheritance" type="orm:inheritance" minOccurs="0"/>
+      <xsd:choice>
+        <xsd:sequence>
+            <xsd:element name="discriminator-value" type="orm:discriminator-value" minOccurs="0"/>
+            <xsd:element name="discriminator-column" type="orm:discriminator-column" minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:element name="class-extractor" type="orm:class-extractor" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:element name="optimistic-locking" type="orm:optimistic-locking" minOccurs="0"/>
+      <xsd:element name="cache" type="orm:cache" minOccurs="0"/>
+      <xsd:element name="cache-interceptor" type="orm:cache-interceptor" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="cache-index" type="orm:cache-index" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="fetch-group" type="orm:fetch-group" 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="serialized-converter" type="orm:serialized-converter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="struct-converter" type="orm:struct-converter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="copy-policy" type="orm:copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="instantiation-copy-policy" type="orm:instantiation-copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="clone-copy-policy" type="orm:clone-copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="serialized-object" type="orm:serialized-object" minOccurs="0" maxOccurs="1"/>
+      <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="uuid-generator" type="orm:uuid-generator" minOccurs="0"/>
+      <xsd:group ref="orm:partitioning-group"/>
+      <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="named-stored-procedure-query" type="orm:named-stored-procedure-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-stored-function-query" type="orm:named-stored-function-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-plsql-stored-procedure-query" type="orm:named-plsql-stored-procedure-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-plsql-stored-function-query" type="orm:named-plsql-stored-function-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="oracle-object" type="orm:oracle-object" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="oracle-array" type="orm:oracle-array" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="plsql-record" type="orm:plsql-record" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="plsql-table" type="orm:plsql-table" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="sql-result-set-mapping" type="orm:sql-result-set-mapping" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="query-redirectors" type="orm:query-redirectors" minOccurs="0" maxOccurs="1"/>
+      <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="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <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="convert" type="orm:convert" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-entity-graph" type="orm:named-entity-graph" minOccurs="0" maxOccurs="unbounded"/>
+      <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="parent-class" type="xsd:string"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="cacheable" type="xsd:boolean"/>
+    <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
+    <xsd:attribute name="read-only" type="xsd:boolean"/>
+    <xsd:attribute name="existence-checking" type="orm:existence-type"/>
+    <xsd:attribute name="exclude-default-mappings" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:group name="partitioning-group">
+    <xsd:sequence>
+      <xsd:element name="partitioning" type="orm:partitioning" minOccurs="0"/>
+      <xsd:element name="replication-partitioning" type="orm:replication-partitioning" minOccurs="0"/>
+      <xsd:element name="round-robin-partitioning" type="orm:round-robin-partitioning" minOccurs="0"/>
+      <xsd:element name="pinned-partitioning" type="orm:pinned-partitioning" minOccurs="0"/>
+      <xsd:element name="range-partitioning" type="orm:range-partitioning" minOccurs="0"/>
+      <xsd:element name="value-partitioning" type="orm:value-partitioning" minOccurs="0"/>
+      <xsd:element name="hash-partitioning" type="orm:hash-partitioning" minOccurs="0"/>
+      <xsd:element name="union-partitioning" type="orm:union-partitioning" minOccurs="0"/>
+      <xsd:element name="partitioned" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+  </xsd:group>
+
+  <!-- **************************************************** -->
+
+  <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:enumeration value="VIRTUAL"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="association-override">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface AssociationOverride {
+            String name();
+            JoinColumn[] joinColumns() default{};
+            JoinTable joinTable() default @JoinTable;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:choice>
+        <xsd:sequence>
+          <xsd:element name="join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="foreign-key" type="orm:foreign-key" minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:element name="join-table" type="orm:join-table" minOccurs="0"/>
+      </xsd:choice>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="column" type="orm:column"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </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:element name="description" type="xsd:string" minOccurs="0"/>
+      <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="basic-collection" type="orm:basic-collection" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="basic-map" type="orm:basic-map" 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="variable-one-to-one" type="orm:variable-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="element-collection" type="orm:element-collection" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="embedded" type="orm:embedded" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="transformation" type="orm:transformation" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="transient" type="orm:transient" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="structure" type="orm:structure" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="array" type="orm:array" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+  </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:choice>
+          <xsd:element name="column" type="orm:column" minOccurs="0"/>
+          <xsd:element name="field" type="orm:field" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:element name="index" type="orm:eclipselink-index" minOccurs="0"/>
+      <xsd:element name="cache-index" type="orm:cache-index" minOccurs="0"/>
+      <xsd:element name="generated-value" type="orm:generated-value" minOccurs="0"/>
+      <xsd:choice minOccurs="0">
+        <xsd:element name="lob" type="orm:lob"/>
+        <xsd:element name="temporal" type="orm:temporal"/>
+        <xsd:element name="enumerated" type="orm:enumerated"/>
+        <xsd:element name="convert" type="orm:convert"/>
+      </xsd:choice>
+      <xsd:choice minOccurs="0">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <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="uuid-generator" type="orm:uuid-generator" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="return-insert" type="orm:return-insert" minOccurs="0"/>
+      <xsd:element name="return-update" type="orm:emptyType" 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="access" type="orm:access-type"/>
+    <xsd:attribute name="mutable" type="xsd:boolean"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </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="convert" type="orm:convert" minOccurs="0"/>
+      <xsd:choice minOccurs="0">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <xsd:element name="collection-table" type="orm:eclipselink-collection-table" minOccurs="0"/>
+      <xsd:element name="join-fetch" type="orm:join-fetch-type" minOccurs="0"/>
+      <xsd:element name="batch-fetch" type="orm:batch-fetch" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="fetch" type="orm:fetch-type"/>
+    <xsd:attribute name="access" type="orm:access-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() default @Column;
+
+          /**
+           * (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="key-converter" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="value-column" type="orm:column" minOccurs="0"/>
+      <xsd:element name="value-converter" type="xsd:string" minOccurs="0"/>
+      <xsd:choice minOccurs="0" maxOccurs="2">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <xsd:element name="collection-table" type="orm:eclipselink-collection-table" minOccurs="0"/>
+      <xsd:element name="join-fetch" type="orm:join-fetch-type" minOccurs="0"/>
+      <xsd:element name="batch-fetch" type="orm:batch-fetch" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="fetch" type="orm:fetch-type"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="cascade-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH};
+
+      </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:element name="cascade-detach" type="orm:emptyType"
+                   minOccurs="0"/>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="class-extractor">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A ClassExtractor allows for a user defined class indicator in place of
+         * providing a discriminator column. The class has the following restrictions:
+
+         *  - It must extend the org.eclipse.persistence.descriptors.ClassExtractor
+         *    class and implement the extractClassFromRow(Record, Session) method.
+         *  - That method must take a database row (a Record/Map) as an argument and
+         *    must return the class to use for that row.
+         *
+         * This method will be used to decide which class to instantiate when reading
+         * from the database. It is the application's responsibility to populate any
+         * typing information in the database required to determine the class from the
+         * row.
+         *
+         * The ClassExtractor must only be set on the root of an entity class or
+         * sub-hierarchy in which a different inheritance strategy is applied. The
+         * ClassExtractor can only be used with the SINGLE_TABLE and JOINED inheritance
+         * strategies.
+         *
+         * If a ClassExtractor is used then a DiscriminatorColumn cannot be used. A
+         * ClassExtractor also cannot be used on either the root or its subclasses.
+         *
+         * In addition, for more complex configurations using a ClassExtractor and a
+         * SINGLE_TABLE strategy, the descriptor's withAllSubclasses and onlyInstances
+         * expressions should be set through the ClassExtractor's initialize method.
+         *
+         * @see org.eclipse.persistence.descriptors.InheritancePolicy.setWithAllSubclassesExpression(Expression)
+         * @see org.eclipse.persistence.descriptors.InheritancePolicy.setOnlyInstancesExpression(Expression)
+         *
+         * @author Guy Pelletier
+         * @since EclipseLink 2.1
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface ClassExtractor {
+            /**
+             * (Required) Defines the name of the class extractor that should be
+             * applied to this entity's descriptor.
+             */
+            Class value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="clone-copy-policy">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * A CloneCopyPolicy is used to set an
+         * org.eclipse.persistence.descriptors.copying.CloneCopyPolicy on an
+         * Entity. A CloneCopyPolicy must specify at one or both of the "method"
+         * or "workingCopyMethod". "workingCopyMethod" is used to clone objects
+         * that will be returned to the user as they are registered in
+         * EclipseLink's transactional mechanism, the UnitOfWork. "method" will
+         * be used for the clone that is used for comparison in conjunction with
+         * EclipseLink's DeferredChangeDetectionPolicy
+         *
+         * A CloneCopyPolicy should be specified on an Entity, MappedSuperclass
+         * or Embeddable.
+         *
+         * Example:
+         * @Entity
+         * @CloneCopyPolicy(method="myCloneMethod")
+         *
+         * or:
+         *
+         * @Entity
+         * @CloneCopyPolicy(method="myCloneMethod", workingCopyMethod="myWorkingCopyCloneMethod")
+         *
+         * or:
+         *
+         * @Entity
+         * @CloneCopyPolicy(workingCopyMethodName="myWorkingCopyClone")
+         */
+        public @interface CloneCopyPolicy {
+
+            /**
+             * (Optional)
+             * Either method or workingCopyMethod must be specified this defines
+             * a method that will be used to create a clone that will be used
+             * for comparison by
+             * EclipseLink's DeferredChangeDetectionPolicy
+             */
+            String method();
+
+            /**
+             * (Optional)
+             * Either method or workingCopyMethod must be specified
+             * this defines a method that will be used to create a clone that
+             * will be used to create the object returned when registering an
+             * Object in an EclipseLink UnitOfWork
+             */
+            String workingCopyMethod();
+
+        }
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="method" type="xsd:string"/>
+    <xsd:attribute name="working-copy-method" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="collection-table">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface CollectionTable {
+            String name() default "";
+            String catalog() default "";
+            String schema() default "";
+            JoinColumn[] joinColumns() default {};
+            UniqueConstraint[] uniqueConstraints() default {};
+            Index[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:sequence>
+        <xsd:element name="join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="foreign-key" type="orm:foreign-key" minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 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:attribute name="creation-suffix" type="xsd:string" />
+    </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="eclipselink-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:attribute name="creation-suffix" type="xsd:string" />
+  </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="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" use="required"/>
+    <xsd:attribute name="object-value" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="mixed-converter">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        This converter is used a mix between the jpa and eclipselink converter
+        at the entity-mappings level. If a name is provided then it is treated
+        as a named eclipselink converter. Otherwise it is treated as a JPA
+        converter class.
+
+        @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();
+        }
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface Converter {
+            boolean autoApply() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+    <xsd:attribute name="auto-apply" type="xsd:boolean"/>
+  </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="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * A Partitioning is used to partition the data for a class across multiple difference databases
+             * or across a database cluster such as Oracle RAC.
+             * Partitioning can provide improved scalability by allowing multiple database machines to service requests.
+             * This annotation configures a custom PartitioningPolicy.
+             *
+             * If multiple partitions are used to process a single transaction, JTA should be used for proper XA transaction support.
+             *
+             * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+             * Partition policies are globally named to allow reuse,
+             * the partitioning policy must also be set using the @Partitioned annotation to be used.
+             *
+             * @see Partitioned
+             * @see org.eclipse.persistence.descriptors.partitioning.PartitioningPolicy
+             * @author James Sutherland
+             * @since EclipseLink 2.2
+             */
+            @Target({TYPE, METHOD, FIELD})
+            @Retention(RUNTIME)
+            public @interface Partitioning {
+                String name();
+
+                /**
+                 * (Required) Full package.class name of a subclass of PartitioningPolicy.
+                 */
+                Class partitioningClass();
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="hash-partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * HashPartitioning partitions access to a database cluster by the hash of a field value from the object,
+             * such as the object's location, or tenant.
+             * The hash indexes into the list of connection pools.
+             * All write or read request for object's with that hash value are sent to the server.
+             * If a query does not include the field as a parameter, then it can either be sent
+             * to all server's and unioned, or left to the sesion's default behavior.
+             *
+             * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+             *
+             * @see org.eclipse.persistence.descriptors.partitioning.HashPartitioningPolicy
+             * @author James Sutherland
+             * @since EclipseLink 2.2
+             */
+            @Target({TYPE, METHOD, FIELD})
+            @Retention(RUNTIME)
+            public @interface HashPartitioning {
+                String name();
+
+                /**
+                 * The database column or query parameter to partition queries by.
+                 * This is the table column name, not the class attribute name.
+                 * The column value must be included in the query and should normally be part of the object's Id.
+                 * This can also be the name of a query parameter.
+                 * If a query does not contain the field the query will not be partitioned.
+                 */
+                Column partitionColumn();
+
+                /**
+                 * List of connection pool names to partition across.
+                 */
+                String[] connectionPools();
+
+                /**
+                 * Defines if queries that do not contain the partition field should be sent
+                 * to every database and have the result unioned.
+                 */
+                boolean unionUnpartitionableQueries() default false;
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="partition-column" type="orm:column"/>
+        <xsd:element name="connection-pool" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="union-unpartitionable-queries" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="range-partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * RangePartitioningPolicy partitions access to a database cluster by a field value from the object,
+         * such as the object's id, location, or tenant.
+         * Each server is assigned a range of values.
+         * All write or read request for object's with that value are sent to the server.
+         * If a query does not include the field as a parameter, then it can either be sent
+         * to all server's and unioned, or left to the sesion's default behavior.
+         *
+         * If multiple partitions are used to process a single transaction, JTA should be used for proper XA transaction support.
+         *
+         * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+         * Partition policies are globally named to allow reuse,
+         * the partitioning policy must also be set using the @Partitioned annotation to be used.
+         *
+         * @see Partitioned
+         * @see org.eclipse.persistence.descriptors.partitioning.RangePartitioningPolicy
+         * @author James Sutherland
+         * @since EclipseLink 2.2
+         */
+        @Target({TYPE, METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface RangePartitioning {
+            String name();
+
+            /**
+             * The database column or query parameter to partition queries by.
+             * This is the table column name, not the class attribute name.
+             * The column value must be included in the query and should normally be part of the object's Id.
+             * This can also be the name of a query parameter.
+             * If a query does not contain the field the query will not be partitioned.
+             */
+            Column partitionColumn();
+
+            /**
+             * (Required) List of connection pool names to load balance across.
+             */
+            RangePartition[] partitions();
+
+            /**
+             * Defines if queries that do not contain the partition field should be sent
+             * to every database and have the result unioned.
+             */
+            boolean unionUnpartitionableQueries() default false;
+
+            /** The type of the start and end values. */
+            Class partitionValueType() default String.class;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="partition-column" type="orm:column"/>
+        <xsd:element name="partition" type="orm:range-partition" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="union-unpartitionable-queries" type="xsd:boolean"/>
+    <xsd:attribute name="partition-value-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="range-partition">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Represent a specific range partition.
+         * Values = startValue and = endValue will be routed to the connection pool.
+         *
+         * @see RangePartitioningPolicy
+         * @see org.eclipse.persistence.descriptors.partitioning.RangePartitioningPolicy
+         * @see org.eclipse.persistence.descriptors.partitioning.RangePartition
+         * @author James Sutherland
+         * @since EclipseLink 2.2
+         */
+        @Target({TYPE, METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface RangePartition {
+            /** The String representation of the range start value. */
+            String startValue() default "";
+            /** The String representation of the range start value. */
+            String endValue() default "";
+            /** The connection pool to route queries to for this range. */
+            String connectionPool();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="start-value" type="xsd:string"/>
+    <xsd:attribute name="end-value" type="xsd:string"/>
+    <xsd:attribute name="connection-pool" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="value-partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * ValuePartitioning partitions access to a database cluster by a field value from the object,
+         * such as the object's location, or tenant.
+         * Each value is assigned a specific server.
+         * All write or read request for object's with that value are sent to the server.
+         * If a query does not include the field as a parameter, then it can either be sent
+         * to all server's and unioned, or left to the sesion's default behavior.
+         *
+         * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+         *
+         * @see org.eclipse.persistence.descriptors.partitioning.ValuePartitioningPolicy
+         * @author James Sutherland
+         * @since EclipseLink 2.2
+         */
+        @Target({TYPE, METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface ValuePartitioning {
+            String name();
+
+            /**
+             * The database column or query parameter to partition queries by.
+             * This is the table column name, not the class attribute name.
+             * The column value must be included in the query and should normally be part of the object's Id.
+             * This can also be the name of a query parameter.
+             * If a query does not contain the field the query will not be partitioned.
+             */
+            Column partitionColumn();
+
+            /** Store the value partitions. Each partition maps a value to a connectionPool. */
+            ValuePartition[] partitions();
+
+            /** The type of the start and end values. */
+            Class partitionValueType() default String.class;
+
+            /** The default connection pool is used for any unmapped values. */
+            String defaultConnectionPool();
+
+            /**
+             * Defines if queries that do not contain the partition field should be sent
+             * to every database and have the result unioned.
+             */
+            boolean unionUnpartitionableQueries() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="partition-column" type="orm:column"/>
+        <xsd:element name="partition" type="orm:value-partition" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="union-unpartitionable-queries" type="xsd:boolean"/>
+    <xsd:attribute name="default-connection-pool" type="xsd:string"/>
+    <xsd:attribute name="partition-value-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="value-partition">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Represent a specific value partition.
+         * The value will be routed to the connection pool.
+         *
+         * @see ValuePartitioningPolicy
+         * @see org.eclipse.persistence.descriptors.partitioning.ValuePartitioningPolicy
+         * @see org.eclipse.persistence.descriptors.partitioning.ValuePartition
+         * @author James Sutherland
+         * @since EclipseLink 2.2
+         */
+        @Target({TYPE, METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface ValuePartition {
+            /** The String representation of the range start value. */
+            String value() default "";
+
+            /** The connection pool to route queries to for this value. */
+            String connectionPool();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="value" type="xsd:string" use="required"/>
+    <xsd:attribute name="connection-pool" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="round-robin-partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * RoundRobinPartitioning sends requests in a round robin fashion to the set of connection pools.
+             * It is for load-balancing read queries across a cluster of database machines.
+             * It requires that the full database be replicated on each machine, so does not support partitioning.
+             * The data should either be read-only, or writes should be replicated on the database.
+             *
+             * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+             *
+             * @see org.eclipse.persistence.descriptors.partitioning.RoundRobinPolicy
+             * @author James Sutherland
+             * @since EclipseLink 2.2
+             */
+            @Target({TYPE, METHOD, FIELD})
+            @Retention(RUNTIME)
+            public @interface RoundRobinPartitioning {
+                String name();
+
+                /**
+                 * (Required) List of connection pool names to load balance across.
+                 */
+                String[] connectionPools();
+
+                /**
+                 * This allows for a set of database to be written to and kept in synch,
+                 * and have reads load-balanced across the databases.
+                 */
+                boolean replicateWrites() default false;
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="connection-pool" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="replicate-writes" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="replication-partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * ReplicationPartitioning sends requests to a set of connection pools.
+             * It is for replicating data across a cluster of database machines.
+             * Only modification queries are replicated.
+             *
+             * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+             *
+             * @see org.eclipse.persistence.descriptors.partitioning.ReplicationPolicy
+             * @author James Sutherland
+             * @since EclipseLink 2.2
+             */
+            @Target({TYPE, METHOD, FIELD})
+            @Retention(RUNTIME)
+            public @interface ReplicationPartitioning {
+                String name();
+
+                /**
+                 * (Required) List of connection pool names to load balance across.
+                 */
+                String[] connectionPools();
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="connection-pool" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="union-partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * UnionPartitioning sends queries to all connection pools and unions the results.
+             * This is for queries or relationships that span partitions when partitioning is used,
+             * such as on a ManyToMany cross partition relationship.
+             *
+             * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+             *
+             * @see org.eclipse.persistence.descriptors.partitioning.UnionPartitioningPolicy
+             * @author James Sutherland
+             * @since EclipseLink 2.2
+             */
+            @Target({TYPE, METHOD, FIELD})
+            @Retention(RUNTIME)
+            public @interface UnionPartitioning {
+                String name();
+
+                /**
+                 * (Required) List of connection pool names to load balance across.
+                 */
+                String[] connectionPools();
+
+                /**
+                 * Defines if write queries should be replicated.
+                 * Writes are normally not replicated when unioning,
+                 * but can be for ManyToMany relationships, when the join table needs to be replicated.
+                 */
+                boolean replicateWrites() default false;
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="connection-pool" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="replicate-writes" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="pinned-partitioning">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * PinnedPartitioning pins requests to a single connection pool.
+         *
+         * Partitioning can be enabled on an Entity, relationship, query, or session/persistence unit.
+         *
+         * @see org.eclipse.persistence.descriptors.partitioning.PinnedPartitioningPolicy
+         * @author James Sutherland
+         * @since EclipseLink 2.2
+         */
+        @Target({TYPE, METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface PinnedPartitioning {
+            String name();
+
+            /**
+             * The connection pool name to pin queries to.
+             */
+            String connectionPool();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="connection-pool" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="column-result">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface ColumnResult {
+          String name();
+          Class type() default void.class;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="class" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="constraint-mode">
+    <xsd:annotation>
+      <xsd:documentation>
+
+       public enum ConstraintMode {CONSTRAINT, NO_CONSTRAINT, PROVIDER_DEFAULT};
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="CONSTRAINT"/>
+      <xsd:enumeration value="NO_CONSTRAINT"/>
+      <xsd:enumeration value="PROVIDER_DEFAULT"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="constructor-result">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface ConstructorResult {
+          Class targetClass();
+          ColumnResult[] columns() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:element name="column" type="orm:column-result" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="target-class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="convert" mixed="true">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface Convert {
+          Class converter() default void.class;
+          String attributeName() default "";
+          boolean disableConversion() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="converter" type="xsd:string"/>
+    <xsd:attribute name="attribute-name" type="xsd:string"/>
+    <xsd:attribute name="disable-conversion" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="copy-policy">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * A CopyPolicy is used to set a
+         * org.eclipse.persistence.descriptors.copying.CopyPolicy on an Entity.
+         * It is required that a class that implements
+         * org.eclipse.persistence.descriptors.copying.CopyPolicy be specified
+         * as the argument.
+         *
+         * A CopyPolicy should be specified on an Entity, MappedSuperclass or
+         * Embeddable.
+         *
+         * For instance:
+         * @Entity
+         * @CopyPolicy("example.MyCopyPolicy")
+         */
+        public @interface CopyPolicy {
+
+        /*
+        * (Required)
+        * This defines the class of the copy policy. It must specify a class
+        * that implements org.eclipse.persistence.descriptors.copying.CopyPolicy
+        */
+        Class value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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="discriminator-class">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A DiscriminatorClass is used within a VariableOneToOne annotation.
+         */
+        @Target({})
+        @Retention(RUNTIME)
+        public @interface DiscriminatorClass {
+          /**
+           * (Required) The discriminator to be stored on the database.
+           */
+          String discriminator();
+
+          /**
+           * (Required) The class to the instantiated with the given
+           * discriminator.
+           */
+          Class value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="discriminator" type="xsd:string" use="required"/>
+    <xsd:attribute name="value" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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: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:complexType name="element-collection">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface ElementCollection {
+          Class targetClass() default void.class;
+          FetchType fetch() default LAZY;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:choice>
+        <xsd:element name="order-by" type="orm:order-by" minOccurs="0"/>
+        <xsd:element name="order-column" type="orm:order-column" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:element name="map-key" type="orm:map-key" minOccurs="0"/>
+        <xsd:sequence>
+          <xsd:element name="map-key-class" type="orm:map-key-class" minOccurs="0"/>
+          <xsd:choice>
+            <xsd:element name="map-key-temporal" type="orm:temporal" minOccurs="0"/>
+            <xsd:element name="map-key-enumerated" type="orm:enumerated" minOccurs="0"/>
+            <xsd:choice minOccurs="0" maxOccurs="unbounded">
+              <xsd:element name="map-key-attribute-override" type="orm:attribute-override"/>
+              <xsd:element name="map-key-convert" type="orm:convert"/>
+              <xsd:element name="map-key-association-override" type="orm:association-override"/>
+            </xsd:choice>
+          </xsd:choice>
+          <xsd:choice>
+            <xsd:element name="map-key-column" type="orm:map-key-column" minOccurs="0"/>
+            <xsd:sequence>
+              <xsd:element name="map-key-join-column" type="orm:map-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
+              <xsd:element name="map-key-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+            </xsd:sequence>
+          </xsd:choice>
+        </xsd:sequence>
+      </xsd:choice>
+      <xsd:element name="column" type="orm:column" minOccurs="0"/>
+      <xsd:choice>
+        <xsd:sequence>
+          <xsd:choice>
+            <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
+            <xsd:element name="enumerated" type="orm:enumerated" minOccurs="0"/>
+            <xsd:element name="lob" type="orm:lob" minOccurs="0"/>
+          </xsd:choice>
+        </xsd:sequence>
+        <xsd:sequence>
+          <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="convert" type="orm:convert" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+      </xsd:choice>
+      <xsd:choice minOccurs="0" maxOccurs="2">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <xsd:choice minOccurs="0">
+          <xsd:element name="collection-table" type="orm:collection-table"/>
+          <xsd:element name="field" type="orm:field"/>
+      </xsd:choice>
+      <xsd:element name="cascade-on-delete" type="xsd:boolean" minOccurs="0"/>
+      <xsd:element name="join-fetch" type="orm:join-fetch-type" minOccurs="0"/>
+      <xsd:element name="batch-fetch" type="orm:batch-fetch" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+      <xsd:element name="delete-all" type="orm:emptyType" minOccurs="0"/>
+      <xsd:group ref="orm:partitioning-group"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="target-class" type="xsd:string"/>
+    <xsd:attribute name="fetch" type="orm:fetch-type"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+    <xsd:attribute name="composite-member" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="array">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Array types are extended object-relational data-types supported by some databases.
+         * Array types are user define types in the database such as VARRAY types on Oracle.
+         * Arrays can contains basic types (VARCHAR) or other Struct types, and can be stored in
+         * a column or in a Struct type.
+         * This annotation can be defined on a collection attribute that is
+         * persisted to an Array type.  The collection can be of basic types, or embeddable
+         * class mapped using a Struct.
+         *
+         * @see org.eclipse.persistence.mappings.structures.ObjectRelationalDataTypeDescriptor
+         * @see org.eclipse.persistence.mappings.structures.ArrayMapping
+         * @see org.eclipse.persistence.mappings.structures.ObjectArrayMapping
+         * @author James Sutherland
+         * @since EclipseLink 2.3
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface Array {
+            /**
+             * (Optional) The basic or embeddable class that is the element
+             * type of the collection.  This element is optional only if the
+             * collection field or property is defined using Java generics,
+             * and must be specified otherwise.  It defaults to the
+             * paramterized type of the collection when defined using
+             * generics.
+             */
+            Class targetClass() default void.class;
+
+            /**
+             * (Required) The database name of the database array structure type.
+             */
+            String databaseType();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column" type="orm:column" minOccurs="0"/>
+      <xsd:choice>
+        <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
+        <xsd:element name="enumerated" type="orm:enumerated" minOccurs="0"/>
+        <xsd:element name="lob" type="orm:lob" minOccurs="0"/>
+        <xsd:element name="convert" type="orm:convert" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:choice minOccurs="0" maxOccurs="2">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="database-type" type="xsd:string" use="required"/>
+    <xsd:attribute name="target-class" type="xsd:string"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </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="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="customizer" type="orm:customizer" minOccurs="0"/>
+      <xsd:element name="change-tracking" type="orm:change-tracking" minOccurs="0"/>
+      <xsd:element name="struct" type="orm:struct" minOccurs="0"/>
+      <xsd:element name="no-sql" type="orm:no-sql" 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="serialized-converter" type="orm:serialized-converter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="struct-converter" type="orm:struct-converter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="copy-policy" type="orm:copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="instantiation-copy-policy" type="orm:instantiation-copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="clone-copy-policy" type="orm:clone-copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="oracle-object" type="orm:oracle-object" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="oracle-array" type="orm:oracle-array" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="plsql-record" type="orm:plsql-record" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="plsql-table" type="orm:plsql-table" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <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="attributes" type="orm:attributes" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+    <xsd:attribute name="parent-class" type="xsd:string"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
+    <xsd:attribute name="exclude-default-mappings" type="xsd:boolean"/>
+  </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:element name="association-override" type="orm:association-override" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="convert" type="orm:convert" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="field" type="orm:field" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="attribute-type" 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:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </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="description" type="xsd:string" 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:sequence>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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-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: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: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:complexType name="fetch-attribute">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface FetchAttribute {
+          /**
+           * (Required) The fetch attribute name.
+           */
+          String name();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="fetch-group">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface FetchGroup {
+          /**
+           * (Required) The fetch group name.
+           */
+          String name();
+
+          /**
+           * (Optional) Indicates whether all relationship attributes
+           * specified in the fetch group should be loaded.
+           */
+          boolean load() default true;
+
+          /**
+           * (Required) The list of attributes to fetch.
+           */
+          FetchAttribute[] attributes();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="attribute" type="orm:fetch-attribute" minOccurs="1" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="load" type="xsd:boolean"/>
+  </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="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="foreign-key">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface ForeignKey {
+          String name() default "";
+          ConstraintMode value() default CONSTRAINT;
+          String foreign-key-definition() default "";
+
+          // Note that the elements that embed the use of the annotation
+          // default this use as @ForeignKey(PROVIDER_DEFAULT).
+
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="constraint-mode" type="orm:constraint-mode"/>
+    <xsd:attribute name="foreign-key-definition" type="xsd:string"/>
+  </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:simpleType name="generation-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum GenerationType { TABLE, SEQUENCE, IDENTITY, UUID, 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="UUID"/>
+      <xsd:enumeration value="AUTO"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="id">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface Id {}
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:choice>
+          <xsd:element name="column" type="orm:column" minOccurs="0"/>
+          <xsd:element name="field" type="orm:field" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:element name="index" type="orm:eclipselink-index" minOccurs="0"/>
+      <xsd:element name="cache-index" type="orm:cache-index" minOccurs="0"/>
+      <xsd:element name="generated-value" type="orm:generated-value" minOccurs="0"/>
+      <xsd:choice minOccurs="0">
+        <xsd:element name="temporal" type="orm:temporal"/>
+        <xsd:element name="enumerated" type="orm:enumerated"/>
+        <xsd:element name="convert" type="orm:convert"/>
+      </xsd:choice>
+      <xsd:choice minOccurs="0">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <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="uuid-generator" type="orm:uuid-generator"
+                   minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="mutable" type="xsd:boolean"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </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:simpleType name="id-validation">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * The IdValidation enum determines the type value that are valid for an Id.
+         * By default null is not allowed, and 0 is not allow for singleton ids of long or int type.
+         * The default value is ZERO for singleton ids, and NULL for composite ids.
+         * This can be set using the @PrimaryKey annotation, or ClassDescriptor API.
+         *
+         * @see PrimaryKey
+         * @see org.eclipse.persistence.descriptors.ClassDescriptor#setIdValidation(IdValidation)
+         * @author James Sutherland
+         * @since EclipseLink 1.0
+         */
+        public enum IdValidation {
+            /**
+             * Only null is not allowed as an id value, 0 is allowed.
+             */
+            NULL,
+
+            /**
+             * null and 0 are not allowed, (only int and long).
+             */
+            ZERO,
+
+            /**
+             * No id validation is done.
+             */
+            NONE
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="NULL"/>
+      <xsd:enumeration value="ZERO"/>
+      <xsd:enumeration value="NONE"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="cache-key-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * Configures what type of Id value is used to store the object in the cache.
+             * This can either be the basic Id value for simple singleton Ids,
+             * or an optimized CacheKey type.
+             *
+             * @see PrimaryKey#cacheKeyType()
+             * @see ClassDescriptor#setCacheKeyType(CacheKeyType)
+             * @author James Sutherland
+             * @since EclipseLink 2.1
+             */
+            public enum CacheKeyType {
+                /**
+                 * This can only be used for simple singleton Ids, such as long/int/String.
+                 * This is the default for simple singleton Ids.
+                 */
+                ID_VALUE,
+
+                /**
+                 * Optimized cache key type that allows composite and complex values.
+                 * This is the default for composite or complex Ids.
+                 */
+                CACHE_ID,
+
+                /**
+                 * The cache key type is automatically configured depending on what is optimal for the class.
+                 */
+                AUTO
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="ID_VALUE"/>
+      <xsd:enumeration value="CACHE_ID"/>
+      <xsd:enumeration value="AUTO"/>
+    </xsd:restriction>
+  </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:complexType name="instantiation-copy-policy">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * An InstantiationCopyPolicy is used to set an
+         * org.eclipse.persistence.descriptors.copying.InstantiationCopyPolicy
+         * on an Entity. InstantiationCopyPolicy is the default CopyPolicy in
+         * EclipseLink and therefore this configuration option is only used to
+         * override other types of copy policies
+         *
+         * An InstantiationCopyPolicy should be specified on an Entity,
+         * MappedSuperclass or Embeddable.
+         *
+         * Example:
+         * @Entity
+         * @InstantiationCopyPolicy
+         */
+        public @interface InstantiationCopyPolicy {
+        }
+      </xsd:documentation>
+    </xsd:annotation>
+  </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 "";
+          ForeignKey foreignKey() default @ForeignKey();
+        }
+
+      </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="batch-fetch-type">
+    <xsd:annotation>
+      <xsd:documentation>
+            public enum BatchFetchType {
+                /**
+                 * This is the default form of batch reading.
+                 * The original query's selection criteria is joined with the batch query.
+                 */
+                JOIN,
+
+                /**
+                 * This uses an SQL EXISTS and a sub-select in the batch query instead of a join.
+                 * This has the advantage of not requiring an SQL DISTINCT which can have issues
+                 * with LOBs, or may be more efficient for some types of queries or on some databases.
+                 */
+                EXISTS,
+
+                /**
+                 * This uses an SQL IN clause in the batch query passing in the source object Ids.
+                 * This has the advantage of only selecting the objects not already contained in the cache,
+                 * and can work better with cursors, or if joins cannot be used.
+                 * This may only work for singleton Ids on some databases.
+                 */
+                IN
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="JOIN"/>
+      <xsd:enumeration value="EXISTS"/>
+      <xsd:enumeration value="IN"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="join-table">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface JoinTable {
+          String name() default "";
+          String catalog() default "";
+          String schema() default "";
+          JoinColumn[] joinColumns() default {};
+          JoinColumn[] inverseJoinColumns() default {};
+          UniqueConstraint[] uniqueConstraints() default {};
+          Index[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:sequence>
+        <xsd:element name="join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="foreign-key" type="orm:foreign-key" minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:sequence>
+        <xsd:element name="inverse-join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="inverse-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 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:attribute name="creation-suffix" type="xsd:string" />
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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="lock-mode-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum LockModeType { READ, WRITE, OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT, PESSIMISTIC_READ, PESSIMISTIC_WRITE, PESSIMISTIC_FORCE_INCREMENT, NONE};
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="READ"/>
+      <xsd:enumeration value="WRITE"/>
+      <xsd:enumeration value="OPTIMISTIC"/>
+      <xsd:enumeration value="OPTIMISTIC_FORCE_INCREMENT"/>
+      <xsd:enumeration value="PESSIMISTIC_READ"/>
+      <xsd:enumeration value="PESSIMISTIC_WRITE"/>
+      <xsd:enumeration value="PESSIMISTIC_FORCE_INCREMENT"/>
+      <xsd:enumeration value="NONE"/>
+
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <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:choice>
+        <xsd:element name="order-by" type="orm:order-by" minOccurs="0"/>
+        <xsd:element name="order-column" type="orm:order-column" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:element name="map-key" type="orm:map-key" minOccurs="0"/>
+        <xsd:sequence>
+          <xsd:element name="map-key-class" type="orm:map-key-class" minOccurs="0"/>
+          <xsd:choice>
+            <xsd:element name="map-key-temporal" type="orm:temporal" minOccurs="0"/>
+            <xsd:element name="map-key-enumerated" type="orm:enumerated" minOccurs="0"/>
+            <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                <xsd:element name="map-key-attribute-override" type="orm:attribute-override"/>
+                <xsd:element name="map-key-convert" type="orm:convert"/>
+                <xsd:element name="map-key-association-override" type="orm:association-override"/>
+            </xsd:choice>
+          </xsd:choice>
+          <xsd:choice>
+            <xsd:element name="map-key-column" type="orm:map-key-column" minOccurs="0"/>
+            <xsd:sequence>
+              <xsd:element name="map-key-join-column" type="orm:map-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
+              <xsd:element name="map-key-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+            </xsd:sequence>
+          </xsd:choice>
+        </xsd:sequence>
+      </xsd:choice>
+      <xsd:choice minOccurs="0" maxOccurs="1">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <xsd:choice>
+          <xsd:element name="join-table" type="orm:join-table" minOccurs="0"/>
+          <xsd:element name="join-field" type="orm:join-field" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:choice>
+      <xsd:element name="cascade" type="orm:cascade-type" minOccurs="0"/>
+      <xsd:element name="cascade-on-delete" type="xsd:boolean" minOccurs="0"/>
+      <xsd:element name="join-fetch" type="orm:join-fetch-type" minOccurs="0"/>
+      <xsd:element name="batch-fetch" type="orm:batch-fetch" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+      <xsd:group ref="orm:partitioning-group"/>
+    </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="access" type="orm:access-type"/>
+    <xsd:attribute name="mapped-by" type="xsd:string"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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:sequence>
+          <xsd:element name="primary-key-join-column" type="orm:primary-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="primary-key-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:sequence>
+          <xsd:element name="join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="foreign-key" type="orm:foreign-key" minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:element name="join-table" type="orm:join-table" minOccurs="0"/>
+        <xsd:element name="join-field" type="orm:join-field" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:choice>
+      <xsd:element name="cascade" type="orm:cascade-type" minOccurs="0"/>
+      <xsd:element name="join-fetch" type="orm:join-fetch-type" minOccurs="0"/>
+      <xsd:element name="batch-fetch" type="orm:batch-fetch" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+      <xsd:group ref="orm:partitioning-group"/>
+    </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="access" type="orm:access-type"/>
+    <xsd:attribute name="maps-id" type="xsd:string"/>
+    <xsd:attribute name="id" type="xsd:boolean"/>
+  </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:complexType name="map-key-class">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface MapKeyClass {
+          Class value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="map-key-column">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface MapKeyColumn {
+          String name() default "";
+          boolean unique() default false;
+          boolean nullable() default false;
+          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="map-key-join-column">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface MapKeyJoinColumn {
+          String name() default "";
+          String referencedColumnName() default "";
+          boolean unique() default false;
+          boolean nullable() default false;
+          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: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="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="multitenant" type="orm:multitenant" minOccurs="0"/>
+      <xsd:element name="additional-criteria" type="orm:additional-criteria" minOccurs="0"/>
+      <xsd:element name="customizer" type="orm:customizer" minOccurs="0"/>
+      <xsd:element name="change-tracking" type="orm:change-tracking" minOccurs="0"/>
+      <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
+      <xsd:element name="primary-key" type="orm:primary-key" minOccurs="0"/>
+      <xsd:element name="optimistic-locking" type="orm:optimistic-locking" minOccurs="0"/>
+      <xsd:element name="cache" type="orm:cache" minOccurs="0"/>
+      <xsd:element name="cache-interceptor" type="orm:cache-interceptor" minOccurs="0"/>
+      <xsd:element name="cache-index" type="orm:cache-index" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="fetch-group" type="orm:fetch-group" 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="serialized-converter" type="orm:serialized-converter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="struct-converter" type="orm:struct-converter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="copy-policy" type="orm:copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="instantiation-copy-policy" type="orm:instantiation-copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="clone-copy-policy" type="orm:clone-copy-policy" minOccurs="0" maxOccurs="1"/>
+      <xsd:element name="serialized-object" type="orm:serialized-object" minOccurs="0" maxOccurs="1"/>
+      <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="uuid-generator" type="orm:uuid-generator"
+                   minOccurs="0"/>
+      <xsd:group ref="orm:partitioning-group"/>
+      <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="named-stored-procedure-query" type="orm:named-stored-procedure-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-stored-function-query" type="orm:named-stored-function-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-plsql-stored-procedure-query" type="orm:named-plsql-stored-procedure-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-plsql-stored-function-query" type="orm:named-plsql-stored-function-query" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="oracle-object" type="orm:oracle-object" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="oracle-array" type="orm:oracle-array" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="plsql-record" type="orm:plsql-record" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="plsql-table" type="orm:plsql-table" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="sql-result-set-mapping"
+                   type="orm:sql-result-set-mapping"
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="query-redirectors" type="orm:query-redirectors" minOccurs="0" maxOccurs="1"/>
+      <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="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <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="attributes" type="orm:attributes" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+    <xsd:attribute name="parent-class" type="xsd:string"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="cacheable" type="xsd:boolean"/>
+    <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
+    <xsd:attribute name="read-only" type="xsd:boolean"/>
+    <xsd:attribute name="existence-checking" type="orm:existence-type"/>
+    <xsd:attribute name="exclude-default-mappings" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="multitenant">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface Multitenant {
+            /**
+             * (Optional) Specify the multi-tenant strategy to use.
+             */
+            MultitenantType value() default MultitenantType.SINGLE_TABLE;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:choice>
+            <xsd:element name="tenant-discriminator-column" type="orm:tenant-discriminator-column" minOccurs="0" maxOccurs="unbounded"/>
+            <xsd:element name="tenant-table-discriminator" type="orm:tenant-table-discriminator" minOccurs="0"/>
+        </xsd:choice>
+    </xsd:sequence>
+    <xsd:attribute name="type" type="orm:multitenant-type"/>
+    <xsd:attribute name="include-criteria" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="multitenant-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum MultitenantType {
+            /**
+             * Specifies that table(s) the entity maps to includes rows for multiple
+             * tenants. The tenant discriminator column(s) are used with application
+             * context values to limit what a persistence context can access.
+             */
+            SINGLE_TABLE,
+
+            /**
+             * Specifies that different tables are used for each tenant. The
+             * tenant table discriminator describes how the table is uniquely
+             * identified, that is, using a suffix/prefix or a separate schema.
+             *
+             * @since 2.4
+             */
+            TABLE_PER_TENANT,
+
+            /**
+             * Specifies that the DB will handle the tenant filtering on all SELECT,
+             * UPDATE and DELETE queries. Using this type assumes that the platform
+             * used with your persistence unit does indeed support VPD.
+             *
+             * @since 2.3.1
+             */
+            VPD
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="SINGLE_TABLE"/>
+      <xsd:enumeration value="VPD"/>
+      <xsd:enumeration value="TABLE_PER_TENANT"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="named-attribute-node">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface NamedAttributeNode {
+          String value();
+          String subgraph() default "";
+          String keySubgraph() default "";
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="subgraph" type="xsd:string"/>
+    <xsd:attribute name="key-subgraph" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="named-entity-graph">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface NamedEntityGraph {
+          String name() default "";
+          NamedAttributeNode[] attributeNodes() default {};
+          boolean includeAllAttributes() default false;
+          NamedSubgraph[] subgraphs() default {};
+          NamedSubGraph[] subclassSubgraphs() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="named-attribute-node"
+                   type="orm:named-attribute-node"
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+      <xsd:element name="subgraph"
+                   type="orm:named-subgraph"
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+      <xsd:element name="subclass-subgraph"
+                   type="orm:named-subgraph"
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="include-all-attributes" type="xsd:boolean"/>
+  </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="description" type="xsd:string" minOccurs="0"/>
+      <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="named-query">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface NamedQuery {
+          String name();
+          String query();
+          LockModeType lockMode() default NONE;
+          QueryHint[] hints() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="query" type="xsd:string"/>
+      <xsd:element name="lock-mode" type="orm:lock-mode-type" minOccurs="0"/>
+      <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-stored-procedure-query">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A NamedStoredProcedureQuery annotation allows the definition of
+         * queries that call stored procedures as named queries.
+         * A NamedStoredProcedureQuery annotation may be defined on an Entity or
+         * MappedSuperclass.
+         */
+        @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.
+           * @deprecated
+           * @see resultClasses
+           */
+          Class resultClass() default void.class;
+
+          /**
+           * (Optional) Refers to the classes of the result.
+           */
+          Class[] resultClasses() default {};
+
+          /**
+           * (Optional) The name of the SQLResultMapping.
+           * @deprecated
+           * @see resultSetMappings
+           */
+          String resultSetMapping() default "";
+
+          /**
+           * (Optional) The names of the SQLResultMappings.
+           */
+          String[] resultSetMappings() default {};
+
+          /**
+           * (Required) The name of the stored procedure.
+           */
+          String procedureName();
+
+          /**
+           * (Optional) Defines if stored procedure returns a result set.
+           * This is only relevant on databases that support returning result sets
+           * from stored procedures.
+           */
+          boolean returnsResultSet() default false;
+
+          /**
+           * (Optional) Defines if the stored procedure returns multiple result sets.
+           * This is only relevant on databases that support multiple result sets from
+           * stored procedures.
+           */
+          boolean multipleResultSets() default false;
+
+          /**
+           * (Optional) Defines if the stored procedure should be called by index or
+           * by name. By index requires that the StoredProcedureParameter are defined
+           * in the same order as the procedure on the database. By name requires the
+           * database platform support naming procedure parameters.
+           */
+          boolean callByIndex() default false;
+
+          /**
+           * (Optional) Defines arguments to the stored procedure.
+           */
+          StoredProcedureParameter[] parameters() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:choice minOccurs="0" maxOccurs="unbounded">
+        <xsd:element name="result-class" type="xsd:string"/>
+        <xsd:element name="result-set-mapping" type="xsd:string"/>
+        <xsd:element name="hint" type="orm:query-hint"/>
+        <xsd:element name="parameter" type="orm:stored-procedure-parameter"/>
+      </xsd:choice>
+    </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" use="required"/>
+    <xsd:attribute name="returns-result-set" type="xsd:boolean"/>
+    <xsd:attribute name="multiple-result-sets" type="xsd:boolean"/>
+    <xsd:attribute name="call-by-index" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="named-subgraph">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface NamedSubgraph {
+          String name();
+          Class type() default void.class;
+          NamedAttributeNode[] attributeNodes();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="named-attribute-node"
+                   type="orm:named-attribute-node"
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="class" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="named-stored-function-query">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A NamedStoredFunctionQuery annotation allows the definition of
+         * queries that call stored function as named queries.
+         * A NamedStoredFunctionQuery annotation may be defined on an Entity or
+         * MappedSuperclass.
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface NamedStoredFunctionQuery {
+          /**
+           * (Required) Unique name that references this stored procedure query.
+           */
+          String name();
+
+          /**
+           * (Optional) Query hints.
+           */
+          QueryHint[] hints() default {};
+
+          /**
+           * (Optional) The name of the SQLResultMapping.
+           */
+          String resultSetMapping() default "";
+
+          /**
+           * (Required) The name of the stored procedure.
+           */
+          String functionName();
+
+          /**
+           * (Optional) Defines if the stored procedure should be called by index or by name.
+           * By index requires that the StoredProcedureParameter are defined in the same order as the procedure on the database.
+           * By name requires the database platform support naming procedure parameters.
+           */
+          boolean callByIndex() default false;
+
+          /**
+           * (Optional) Defines arguments to the stored procedure.
+           */
+          StoredProcedureParameter[] parameters() default {};
+
+          /**
+           * (Required) Defines return of the stored function.
+           */
+          StoredProcedureParameter[] returnParameter();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="hint" type="orm:query-hint" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="parameter" type="orm:stored-procedure-parameter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="return-parameter" type="orm:stored-procedure-parameter" minOccurs="1"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="result-set-mapping" type="xsd:string"/>
+    <xsd:attribute name="function-name" type="xsd:string" use="required"/>
+    <xsd:attribute name="call-by-index" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="named-plsql-stored-function-query">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * A NamedPLSQLStoredFunctionQuery annotation allows the definition of queries that
+             * call PLSQL stored functions as named queries.
+             * The PLSQL support adds support for complex PLSQL types such as RECORD and TABLE types,
+             * that are not accessible from JDBC.
+             *
+             * A NamedPLSQLStoredFunctionQuery annotation may be defined on an Entity or
+             * MappedSuperclass.
+             *
+             * @author James Sutherland
+             * @since EclipseLink 2.3
+             */
+            @Target({TYPE})
+            @Retention(RUNTIME)
+            public @interface NamedPLSQLStoredFunctionQuery {
+                /**
+                 * (Required) Unique name that references this stored procedure query.
+                 */
+                String name();
+
+                /**
+                 * (Optional) Query hints.
+                 */
+                QueryHint[] hints() default {};
+
+                /**
+                 * (Optional) The name of the SQLResultMapping.
+                 */
+                String resultSetMapping() default "";
+
+                /**
+                 * (Required) The name of the stored procedure.
+                 */
+                String functionName();
+
+                /**
+                 * (Optional) Defines the parameters to the stored procedure.
+                 */
+                PLSQLParameter[] parameters() default {};
+
+                /**
+                 * (Required) Defines the return value of the stored function.
+                 */
+                PLSQLParameter returnParameter();
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="hint" type="orm:query-hint" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="parameter" type="orm:plsql-parameter" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="return-parameter" type="orm:plsql-parameter" minOccurs="1"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="result-set-mapping" type="xsd:string"/>
+    <xsd:attribute name="function-name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="named-plsql-stored-procedure-query">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * A PLSQLNamedStoredProcedureQuery annotation allows the definition of queries that
+             * call PLSQL stored procedures as named queries.
+             * The PLSQL support adds support for complex PLSQL types such as RECORD and TABLE types,
+             * that are not accessible from JDBC.
+             *
+             * A PLSQLNamedStoredProcedureQuery annotation may be defined on an Entity or
+             * MappedSuperclass.
+             *
+             * @author James Sutherland
+             * @since EclipseLink 2.3
+             */
+            @Target({TYPE})
+            @Retention(RUNTIME)
+            public @interface NamedPLSQLStoredProcedureQuery {
+                /**
+                 * (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) Defines the parameters to the stored procedure.
+                 */
+                PLSQLParameter[] parameters() default {};
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="hint" type="orm:query-hint" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="parameter" type="orm:plsql-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" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="oracle-object">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * An OracleObject annotation is used to define an Oracle database OBJECT type.
+         * This type can be used within PLSQL procedure calls.
+         *
+         * @see NamedPLSQLStoredProcedureQuery
+         * @author David McCann
+         * @since EclipseLink 2.5
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface OracleObject {
+
+            /**
+             * (Required) The name of the OBJECT type in the database.
+             */
+            String name();
+
+            /**
+             * (Optional) The Java class to map the OBJECT type to.
+             * This class must be mapped using a @Struct annotation.
+             */
+            Class javaType() default void.class;
+
+            /**
+             * (Required) Defines the fields in the record type.
+             */
+            PLSQLParameter[] fields();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="field" type="orm:plsql-parameter" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="java-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="oracle-array">
+    <xsd:annotation>
+      <xsd:documentation>
+       /**
+        * An OracleArray annotation is used to define an Oracle database VARRAY type.
+        * This type can be used within PLSQL procedure calls.
+        *
+        * @see NamedPLSQLStoredProcedureQuery
+        * @author David McCann
+        * @since EclipseLink 2.5
+        */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface OracleArray {
+            /**
+             * (Required) The name of the VARRAY type in the database.
+             */
+            String name();
+
+            /**
+             * (Optional) The name of the database type this VARRAY holds onto.
+             */
+            String nestedType() default "VARCHAR_TYPE";
+
+            /**
+             * (Optional) The Java Collection class to map the VARRAY to.
+             * This can be any valid Collection implementation.
+             */
+            Class javaType() default ArrayList.class;
+        }
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="java-type" type="xsd:string"/>
+    <xsd:attribute name="nested-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+  <xsd:complexType name="plsql-record">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A PLSQLRecord annotation is used to define a database PLSQL RECORD type.
+         * This type can be used within PLSQL procedure calls.
+         *
+         * @see NamedPLSQLStoredProcedureQuery
+         * @author James Sutherland
+         * @since EclipseLink 2.3
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface PLSQLRecord {
+
+            /**
+             * (Required) The name of the record type in the database.
+             */
+            String name();
+
+            /**
+             * (Required) The name of the database OBJECT TYPE that mirrors the record's structure.
+             * The record will be converted to/from this type so it can be passed through JDBC.
+             */
+            String compatibleType();
+
+            /**
+             * (Optional) The Java class to map the object-type to.
+             * This class must be mapped using a @Struct annotation.
+             */
+            Class javaType() default void.class;
+
+            /**
+             * (Required) Defines the fields in the record type.
+             */
+            PLSQLParameter[] fields();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="field" type="orm:plsql-parameter" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="compatible-type" type="xsd:string"/>
+    <xsd:attribute name="java-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="plsql-table">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A PLSQLTable annotation is used to define a database PLSQL TABLE type.
+         * This type can be used within PLSQL procedure calls.
+         *
+         * @see NamedPLSQLStoredProcedureQuery
+         * @author James Sutherland
+         * @since EclipseLink 2.3
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface PLSQLTable {
+
+            /**
+             * (Required) The name of the record type in the database.
+             */
+            String name();
+
+            /**
+             * (Required) The name of the database VARRAY type that mirrors the table's structure.
+             * The table will be converted to/from this type so it can be passed through JDBC.
+             */
+            String compatibleType();
+
+            /**
+             * (Required) The name of the database OBJECT TYPE or VARRAY type that mirrors the record's structure.
+             * The record will be converted to/from this type so it can be passed through JDBC.
+             */
+            String nestedType() default "VARCHAR_TYPE";
+
+            /**
+             * (Optional) The Java Collection class to map the varray to.
+             * This can be any valid Collection implementation.
+             */
+            Class javaType() default ArrayList.class;
+
+            /**
+             * (Optional) Indicates a non-associative (nested) table.
+             * This method would typically be used when generating a constructor for the
+             * collection in PL/SQL (as the constructors for associative arrays (Varray)
+             * and a non-associative (nested) tables differ).
+             */
+            boolean isNestedTable() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="compatible-type" type="xsd:string"/>
+    <xsd:attribute name="java-type" type="xsd:string"/>
+    <xsd:attribute name="nested-type" type="xsd:string"/>
+    <xsd:attribute name="nested-table" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="object-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: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="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:choice>
+        <xsd:element name="order-by" type="orm:order-by" minOccurs="0"/>
+        <xsd:element name="order-column" type="orm:order-column" minOccurs="0"/>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:element name="map-key" type="orm:map-key" minOccurs="0"/>
+        <xsd:sequence>
+          <xsd:element name="map-key-class" type="orm:map-key-class" minOccurs="0"/>
+          <xsd:choice>
+            <xsd:element name="map-key-temporal" type="orm:temporal" minOccurs="0"/>
+            <xsd:element name="map-key-enumerated" type="orm:enumerated" minOccurs="0"/>
+            <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                <xsd:element name="map-key-attribute-override" type="orm:attribute-override"/>
+                <xsd:element name="map-key-convert" type="orm:convert"/>
+                <xsd:element name="map-key-association-override" type="orm:association-override"/>
+            </xsd:choice>
+          </xsd:choice>
+          <xsd:choice>
+            <xsd:element name="map-key-column" type="orm:map-key-column" minOccurs="0"/>
+            <xsd:sequence>
+              <xsd:element name="map-key-join-column" type="orm:map-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
+              <xsd:element name="map-key-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+            </xsd:sequence>
+          </xsd:choice>
+       </xsd:sequence>
+     </xsd:choice>
+     <xsd:choice minOccurs="0" maxOccurs="1">
+       <xsd:element name="converter" type="orm:converter"/>
+       <xsd:element name="type-converter" type="orm:type-converter"/>
+       <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+       <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+       <xsd:element name="struct-converter" type="orm:struct-converter"/>
+     </xsd:choice>
+     <xsd:choice>
+       <xsd:element name="join-table" type="orm:join-table" minOccurs="0"/>
+       <xsd:sequence>
+         <xsd:element name="join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+         <xsd:element name="foreign-key" type="orm:foreign-key" minOccurs="0"/>
+       </xsd:sequence>
+       <xsd:element name="join-field" type="orm:join-field" minOccurs="0" maxOccurs="unbounded"/>
+     </xsd:choice>
+     <xsd:element name="cascade" type="orm:cascade-type" minOccurs="0"/>
+     <xsd:element name="cascade-on-delete" type="xsd:boolean" minOccurs="0"/>
+     <xsd:element name="private-owned" type="orm:emptyType" minOccurs="0"/>
+     <xsd:element name="join-fetch" type="orm:join-fetch-type" minOccurs="0"/>
+     <xsd:element name="batch-fetch" type="orm:batch-fetch" minOccurs="0"/>
+     <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+     <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+     <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+     <xsd:element name="delete-all" type="orm:emptyType" minOccurs="0"/>
+     <xsd:group ref="orm:partitioning-group"/>
+    </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="access" type="orm:access-type"/>
+    <xsd:attribute name="mapped-by" type="xsd:string"/>
+    <xsd:attribute name="orphan-removal" type="xsd:boolean"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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 "";
+          boolean orphanRemoval() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:choice>
+        <xsd:sequence>
+          <xsd:element name="primary-key-join-column" type="orm:primary-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="primary-key-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:sequence>
+          <xsd:element name="join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="foreign-key" type="orm:foreign-key" minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:element name="join-table" type="orm:join-table" minOccurs="0"/>
+        <xsd:element name="join-field" type="orm:join-field" minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:choice>
+      <xsd:element name="cascade" type="orm:cascade-type" minOccurs="0"/>
+      <xsd:element name="cascade-on-delete" type="xsd:boolean" minOccurs="0"/>
+      <xsd:element name="private-owned" type="orm:emptyType" minOccurs="0"/>
+      <xsd:element name="join-fetch" type="orm:join-fetch-type" minOccurs="0"/>
+      <xsd:element name="batch-fetch" type="orm:batch-fetch" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+      <xsd:group ref="orm:partitioning-group"/>
+    </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="access" type="orm:access-type"/>
+    <xsd:attribute name="mapped-by" type="xsd:string"/>
+    <xsd:attribute name="orphan-removal" type="xsd:boolean"/>
+    <xsd:attribute name="maps-id" type="xsd:string"/>
+    <xsd:attribute name="id" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="optimistic-locking">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * An optimistic-locking element is used to specify the type of
+         * optimistic locking EclipseLink should use when updating or deleting
+         * entities. An optimistic-locking specification is supported on
+         * an entity or mapped-superclass.
+         *
+         * It is used in conjunction with the optimistic-locking-type.
+         */
+        @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" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="type" type="orm:optimistic-locking-type"/>
+    <xsd:attribute name="cascade" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="optimistic-locking-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A simple type that is used within an optimistic-locking
+         * specification to specify the type of optimistic-locking that
+         * EclipseLink should use when updating or deleting entities.
+         */
+        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:documentation>
+    </xsd:annotation>
+
+    <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: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="order-column">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface OrderColumn {
+          String name() default "";
+          boolean nullable() default true;
+          boolean insertable() default true;
+          boolean updatable() default true;
+          String columnDefinition() default "";
+         }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <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="correction-type" type="orm:order-column-correction-type"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="order-column-correction-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum OrderCorrectionType {
+          READ,
+          READ_WRITE,
+          EXCEPTION
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="READ"/>
+      <xsd:enumeration value="READ_WRITE"/>
+      <xsd:enumeration value="EXCEPTION"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="post-load">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD}) @Retention(RUNTIME)
+        public @interface PostLoad {}
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="method-name" 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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="primary-key">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         *  The PrimaryKey annotation allows advanced configuration of the Id.
+         *  A validation policy can be given that allows specifying if zero is a valid id value.
+         *  The set of primary key columns can also be specified precisely.
+         *
+         * @author James Sutherland
+         * @since EclipseLink 1.1
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface PrimaryKey {
+          /**
+           * (Optional) Configures what id validation is done.
+           * By default 0 is not a valid id value, this can be used to allow 0 id values.
+           */
+          IdValidation validation() default IdValidation.ZERO;
+
+          /**
+           * (Optional) Configures what cache key type is used to store the object in the cache.
+           * By default the type is determined by what type is optimal for the class.
+           */
+          CacheKeyType cacheKeyType() default CacheKeyType.AUTO;
+
+          /**
+           * (Optional) Used to specify the primary key columns directly.
+           * This can be used instead of @Id if the primary key includes a non basic field,
+           * such as a foreign key, or a inheritance discriminator, embedded, or transformation mapped field.
+           */
+          Column[] columns() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column" type="orm:column" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="validation" type="orm:id-validation"/>
+    <xsd:attribute name="cache-key-type" type="orm:cache-key-type"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <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:complexType name="property">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        A user defined mapping's property.
+        @Target({METHOD, FIELD, TYPE})
+        @Retention(RUNTIME)
+        public @interface Property {
+          /**
+           * Property name.
+           */
+          String name();
+
+          /**
+           * String representation of Property value,
+           * converted to an instance of valueType.
+           */
+          String value();
+
+          /**
+           * Property value type.
+           * The value converted to valueType by ConversionManager.
+           * If specified must be a simple type that could be handled by
+           * ConversionManager:
+           * numerical, boolean, temporal.
+           */
+          Class valueType() default String.class;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="value" type="xsd:string" use="required"/>
+    <xsd:attribute name="value-type" type="xsd:string"/>
+  </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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="value" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="query-redirectors">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface QueryRedirectors {
+
+            /**
+             * This AllQueries Query Redirector will be applied to any executing object query
+             * that does not have a more precise redirector (like the
+             * ReadObjectQuery Redirector) or a redirector set directly on the query.
+             * Query redirectors allow the user to intercept query execution preventing
+             * it or alternately performing some side effect like auditing.
+             *
+             */
+            Class allQueries() default void.class;
+
+            /**
+             * A Default ReadAll Query Redirector will be applied to any executing
+             * ReadAllQuery that does not have a redirector set directly on the query.
+             * Query redirectors allow the user to intercept query execution preventing
+             * it or alternately performing some side effect like auditing.
+             * For users executing a JPA Query through the getResultList() API this is the redirector that will be invoked
+             */
+            Class readAll() default void.class;
+
+            /**
+             * A Default ReadObject Query Redirector will be applied to any executing
+             * ReadObjectQuery that does not have a redirector set directly on the query.
+             * Query redirectors allow the user to intercept query execution preventing
+             * it or alternately performing some side effect like auditing.
+             * For users executing a JPA Query through the getSingleResult() API or EntityManager.find() this is the redirector that will be invoked
+             */
+            Class readObject() default void.class;
+
+            /**
+             * A Default ReportQuery Redirector will be applied to any executing
+             * ReportQuery that does not have a redirector set directly on the query.
+             * Query redirectors allow the user to intercept query execution preventing
+             * it or alternately performing some side effect like auditing.
+             * For users executing a JPA Query that contains agregate functions or selects multiple entities this is the redirector that will be invoked
+             */
+            Class report() default void.class;
+
+            /**
+             * A Default Update Query Redirector will be applied to any executing
+             * UpdateObjectQuery or UpdateAllQuery that does not have a redirector set directly on the query.
+             * In EclipseLink an UpdateObjectQuery is executed whenever flushing changes to the datasource.
+             * Query redirectors allow the user to intercept query execution preventing
+             * it or alternately performing some side effect like auditing.
+             */
+            Class update() default void.class;
+
+            /**
+             * A Default Insert Query Redirector will be applied to any executing
+             * InsertObjectQuery that does not have a redirector set directly on the query.
+             * In EclipseLink an InsertObjectQuery is executed when persisting an object to the datasource.
+             * Query redirectors allow the user to intercept query execution preventing
+             * it or alternately performing some side effect like auditing.
+             */
+            Class insert() default void.class;
+
+            /**
+             * A Default Delete Object Query Redirector will be applied to any executing
+             * DeleteObjectQuery or DeleteAllQuery that does not have a redirector set directly on the query.
+             * Query redirectors allow the user to intercept query execution preventing
+             * it or alternately performing some side effect like auditing.
+             */
+            Class delete() default void.class;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="all-queries" type="xsd:string"/>
+    <xsd:attribute name="read-all" type="xsd:string"/>
+    <xsd:attribute name="read-object" type="xsd:string"/>
+    <xsd:attribute name="report" type="xsd:string"/>
+    <xsd:attribute name="update" type="xsd:string"/>
+    <xsd:attribute name="insert" type="xsd:string"/>
+    <xsd:attribute name="delete" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="read-transformer">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Annotation for org.eclipse.persistence.mappings.TransformationMapping.
+         * Unless the TransformationMapping is write-only, it should have a
+         * ReadTransformer, it defines transformation of database column(s)
+         * value(s)into attribute value.
+         *
+         * Also unless it's a read-only mapping, either WriteTransformer
+         * annotation or WriteTransformers annotation should be specified. Each
+         * WriteTransformer defines transformation of the attribute value to a
+         * single database column value (column is specified in the
+         * WriteTransformer).
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface ReadTransformer {
+            /**
+             * User-defined class that must implement the
+             * org.eclipse.persistence.mappings.transformers.AttributeTransformer
+             * interface. The class will be instantiated, its
+             * buildAttributeValue will be used to create the value to be
+             * assigned to the attribute.
+             * Either transformerClass or method must be specified, but not both.
+             */
+            Class transformerClass() default void.class;
+
+            /**
+             * The mapped class must have a method with this name which returns
+             * a value to be assigned to the attribute (not assigns the value to
+             * the attribute). Either transformerClass or method must be
+             * specified, but not both.
+             */
+            String method() default "";
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="transformer-class" type="xsd:string"/>
+    <xsd:attribute name="method" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="return-insert">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface ReturnInsert {
+            /**
+             * A ReturnInsert annotation allows for INSERT operations to return
+             * values back into the object being written. This allows for table
+             * default values, trigger or stored procedures computed values to
+             * be set back into the object.
+             */
+            boolean returnOnly() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="return-only" type="xsd:boolean"/>
+  </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 {};
+          Index[] indexes() default {};
+         }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+        <xsd:sequence>
+            <xsd:element name="primary-key-join-column" type="orm:primary-key-join-column" minOccurs="0" maxOccurs="unbounded"/>
+            <xsd:element name="primary-key-foreign-key" type="orm:foreign-key" minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:element name="unique-constraint" type="orm:unique-constraint" minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="index" type="orm:index" 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:attribute name="creation-suffix" type="xsd:string" />
+  </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 "";
+          String catalog() default "";
+          String schema() default "";
+          int initialValue() default 1;
+          int allocationSize() default 50;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="sequence-name" type="xsd:string"/>
+    <xsd:attribute name="catalog" type="xsd:string"/>
+    <xsd:attribute name="schema" type="xsd:string"/>
+    <xsd:attribute name="initial-value" type="xsd:int"/>
+    <xsd:attribute name="allocation-size" type="xsd:int"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="serialized-object">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface SerializedObject {
+            /**
+             * The Class that implements org.eclipse.persistence.descriptors.SerializedObjectPolicy interface.
+             * This class must be specified.
+             */
+            Class value();
+
+            /**
+             * (Optional) The column that holds the serialized object. By default it's a BLOB column named "SOP" in entity's main table.
+             */
+            Column column() default @Column(name="SOP");
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column" type="orm:column" minOccurs="0" maxOccurs="1"/>
+    </xsd:sequence>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </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 {};
+          ConstructorResult[] classes() default {};
+          ColumnResult[] columns() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="entity-result" type="orm:entity-result"
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="constructor-result" type="orm:constructor-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="stored-procedure-parameter">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A StoredProcedureParameter annotation is used within a
+         * NamedStoredProcedureQuery annotation.
+         */
+        @Target({})
+        @Retention(RUNTIME)
+        public @interface StoredProcedureParameter {
+          /**
+           * (Optional) The direction of the stored procedure parameter.
+           * @deprecated
+           * @see mode()
+           */
+          Direction direction() default IN;
+
+          /**
+           * (Optional) The direction of the stored procedure parameter.
+           */
+          ParameterMode mode() default ParameterMode.IN;
+
+          /**
+           * (Optional) Stored procedure parameter name.
+           */
+          String name() default "";
+
+          /**
+           * (Required) The query parameter name.
+           */
+          String queryParameter();
+
+          /**
+           * (Optional) Define if the parameter is required, or optional and defaulted by the procedure.
+           */
+          boolean optional() default false;
+
+          /**
+           * (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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="direction" type="orm:direction-type"/>
+    <xsd:attribute name="mode" type="orm:parameter-mode"/>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="query-parameter" type="xsd:string" use="required"/>
+    <xsd:attribute name="optional" type="xsd:boolean"/>
+    <xsd:attribute name="type" type="xsd:string"/>
+    <xsd:attribute name="class" 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="plsql-parameter">
+    <xsd:annotation>
+      <xsd:documentation>
+
+            /**
+             * A PLSQLParameter annotation is used within a
+             * NamedPLSQLStoredProcedureQuery or PLSQLRecord annotation.
+             *
+             * @see NamedPLSQLStoredProcedureQuery
+             * @see PLSQLRecord
+             * @author James Sutherland
+             * @since EclipseLink 2.3
+             */
+            @Target({})
+            @Retention(RUNTIME)
+            public @interface PLSQLParameter {
+                /**
+                 * (Optional) The direction of the stored procedure parameter.
+                 */
+                Direction direction() default IN;
+
+                /**
+                 * (Required) Stored procedure parameter name.
+                 */
+                String name() default "";
+
+                /**
+                 * (Optional) The query parameter name.
+                 */
+                String queryParameter();
+
+                /**
+                 * (Optional) Define if the parameter is required, or optional and defaulted by the procedure.
+                 */
+                boolean optional() default false;
+
+                /**
+                 * (Optional) The database data-type for the paramter.
+                 * This either one of the type constants defined in OraclePLSQLTypes, or JDBCTypes,
+                 * or a custom record or table type name.
+                 * @see PLSQLRecord
+                 * @see OraclePLSQLTypes
+                 * @see JDBCTypes
+                 */
+                String databaseType() default "VARCHAR";
+
+                /**
+                 * (Optional) The max length of the field value.
+                 */
+                int length() default 255;
+
+                /**
+                 * (Optional) If a numeric, the max scale value.
+                 */
+                int scale() default 0;
+
+                /**
+                 * (Optional) If a numeric, the max precision value.
+                 */
+                int precision() default 0;
+            }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="direction" type="orm:direction-type"/>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="query-parameter" type="xsd:string"/>
+    <xsd:attribute name="optional" type="xsd:boolean"/>
+    <xsd:attribute name="database-type" type="xsd:string"/>
+    <xsd:attribute name="length" type="xsd:integer"/>
+    <xsd:attribute name="scale" type="xsd:integer"/>
+    <xsd:attribute name="precision" type="xsd:integer"/>
+  </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 EclipseLink interface
+           * org.eclipse.persistence.mappings.converters.Converter
+           */
+          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="struct">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Struct types are extended object-relational data-types supported by some databases.
+         * Struct types are user define types in the database such as OBJECT types on Oracle.
+         * Structs can normally contains Arrays (VARRAY) or other Struct types, and can be stored in
+         * a column or a table.
+         * This annotation define a class to map to a database Struct type.
+         * The class should normally be an Embeddable, but could also be an Entity if stored in a object table.
+         *
+         * @see org.eclipse.persistence.mappings.structures.ObjectRelationalDataTypeDescriptor
+         * @see org.eclipse.persistence.mappings.structures.StructureMapping
+         * @author James Sutherland
+         * @since EclipseLink 2.3
+         */
+        @Target({TYPE, METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface Struct {
+            /**
+             * (Required) The database name of the database structure type.
+             */
+            String name();
+
+            /**
+             * (Optional) Defines the order of the fields contained in the database structure type.
+             */
+            String[] fields() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="field" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="structure">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Struct types are extended object-relational data-types supported by some databases.
+         * Struct types are user define types in the database such as OBJECT types on Oracle.
+         * Structs can normally contains Arrays (VARRAY) or other Struct types, and can be stored in
+         * a column or a table.
+         * This annotation can be defined on a field/method to define an StructureMapping to an embedded Struct type.
+         * The target Embeddable must be mapped using the Struct annotation.
+         *
+         * @see Struct
+         * @see org.eclipse.persistence.mappings.structures.ObjectRelationalDataTypeDescriptor
+         * @see org.eclipse.persistence.mappings.structures.StructureMapping
+         * @author James Sutherland
+         * @since EclipseLink 2.3
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface Structure {
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </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 {};
+          Index[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 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:attribute name="creation-suffix" type="xsd:string" />
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="index">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface Index {
+          String name() default "";
+          String columnList();
+          boolean unique() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="column-list" type="xsd:string" use="required"/>
+    <xsd:attribute name="unique" type="xsd:boolean"/>
+  </xsd:complexType>
+
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="eclipselink-index">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Allow a database INDEX to be define when generating DDL.
+         * The @Index can be defined on a Entity class, or on an attribute.
+         * The column is defaulted when defined on a attribute.
+         *
+         * @author James Sutherland
+         * @since EclipseLink 2.2
+         */
+        @Target({METHOD, FIELD, TYPE})
+        @Retention(RUNTIME)
+        public @interface Index {
+            /** The name of the INDEX, defaults to INDEX_(table-name) */
+            String name() default "";
+
+            /** The schema of the INDEX */
+            String schema() default "";
+
+            /** The catalog of the INDEX */
+            String catalog() default "";
+
+            /** The table to define the index on, defaults to entities primary table. */
+            String table() default "";
+
+            boolean unique() default false;
+
+            /**
+             * Specify the set of columns to define the index on.
+             * Not required when annotated on a field/method.
+             */
+            String[] columnNames() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column-name" type="xsd:string" 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:attribute name="table" type="xsd:string"/>
+    <xsd:attribute name="unique" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="cache-index">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Allow a cache index to be define.
+         * A cache index allow singleResult queries to obtain a cache hit when querying on the indexed fields.
+         * resultList queries cannot obtain cache hits, as it is unknown if all of the objects are in memory,
+         * (unless the cache usage query hint is used).
+         * The index should be unique, but if not unique, the first indexed object will be returned.
+         * Cache indexes are only relevant when caching is enabled.
+         * The @CacheIndex can be defined on a Entity class, or on an attribute.
+         * The column is defaulted when defined on a attribute.
+         *
+         * @author James Sutherland
+         * @since EclipseLink 2.4
+         */
+        @Target({METHOD, FIELD, TYPE})
+        @Retention(RUNTIME)
+        public @interface CacheIndex {
+            /**
+             * Specify the set of columns to define the index on.
+             * Not required when annotated on a field/method.
+             */
+            String[] columnNames() default {};
+
+            /**
+             * Specify if the indexed field is updateable.
+             * If updateable the object will be re-indexed on each update/refresh.
+             */
+            boolean updateable() default true;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column-name" type="xsd:string"
+                   minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="updateable" type="xsd:boolean"/>
+  </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 {};
+          Indexes[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 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="creation-suffix" 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:complexType name="uuid-generator">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface UuidGenerator {
+          String name();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </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:complexType name="tenant-discriminator-column">
+    <xsd:annotation>
+      <xsd:documentation>
+        @Target({})
+        @Retention(RUNTIME)
+        public @interface TenantDiscriminatorColumn {
+            /**
+             * (Optional) The name of column to be used for the tenant discriminator.
+             */
+            String name() default "TENANT_ID";
+
+            /**
+             * (Optional) The name of the context property to apply to the
+             * tenant discriminator column.
+             */
+            String contextProperty() default "eclipselink.tenant-id";
+
+            /**
+             * (Optional) The type of object/column to use as a class discriminator.
+             * Defaults to {@link DiscriminatorType#STRING DiscriminatorType.STRING}.
+             */
+            DiscriminatorType discriminatorType() default DiscriminatorType.STRING;
+
+            /**
+             * (Optional) The SQL fragment that is used when generating the DDL
+             * for the discriminator column.
+             * Defaults to the provider-generated SQL to create a column
+             * of the specified discriminator type.
+             */
+            String columnDefinition() default "";
+
+            /**
+             * (Optional) The column length for String-based discriminator types.
+             * Ignored for other discriminator types.
+             */
+            int length() default 31;
+
+            /**
+             * (Optional) The name of the table that contains the column.
+             * If absent the column is assumed to be in the primary table.
+             */
+            String table() default "";
+
+            /**
+             * Specifies that the tenant discriminator column is part of the primary
+             * key of the tables.
+             */
+            boolean primaryKey() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="context-property" 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:attribute name="table" type="xsd:string"/>
+    <xsd:attribute name="primary-key" type="xsd:boolean"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="tenant-table-discriminator">
+    <xsd:annotation>
+      <xsd:documentation>
+        @Target({})
+        @Retention(RUNTIME)
+        public @interface TenantDiscriminatorColumn {
+            /**
+             * (Optional) The name of the context property to apply to as
+             * tenant table discriminator. Default is "eclipselink-tenant.id"
+             */
+            String contextProperty() default PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT;
+
+            /**
+             * (Optional) The type of tenant table discriminator to use with the tables
+             * of the persistence unit.
+             * Defaults to {@link TenantTableDiscriminatorType#SUFFIX TenantTableDiscriminatorType.SUFFIX}.
+             */
+            TenantTableDiscriminatorType type() default TenantTableDiscriminatorType.SUFFIX;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="context-property" type="xsd:string"/>
+    <xsd:attribute name="type" type="orm:tenant-table-discriminator-type"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="tenant-table-discriminator-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum TenantTableDiscriminatorType { SCHEMA, SUFFIX, PREFIX }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="SCHEMA"/>
+      <xsd:enumeration value="SUFFIX"/>
+      <xsd:enumeration value="PREFIX"/>
+    </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="transformation">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Transformation is an optional annotation for
+         * org.eclipse.persistence.mappings.TransformationMapping.
+         * TransformationMapping allows to map an attribute to one or more
+         * database columns.
+         *
+         * Transformation annotation is an optional part of
+         * TransformationMapping definition. Unless the TransformationMapping is
+         * write-only, it should have a ReadTransformer, it defines
+         * transformation of database column(s) value(s)into attribute value.
+         * Also unless it's a read-only mapping, either WriteTransformer
+         * annotation or WriteTransformers annotation should be specified. Each
+         * WriteTransformer defines transformation of the attribute value to a
+         * single database column value (column is specified in the
+         * WriteTransformer).
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface Transformation {
+            /**
+             * (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 EAGER.
+             */
+            FetchType fetch() default EAGER;
+
+            /**
+             * (Optional) The optional element is a hint as to whether the value
+             *  of the field or property may be null. It is disregarded
+             *  for primitive types, which are considered non-optional.
+             */
+            boolean optional() default true;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="read-transformer" type="orm:read-transformer"/>
+      <xsd:element name="write-transformer" type="orm:write-transformer" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" 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="access" type="orm:access-type"/>
+    <xsd:attribute name="mutable" type="xsd:boolean"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </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="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="serialized-converter">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * A SerializedConverter is used to serialize an object's value into a database binary, character, or XML field.
+         * This annotation allows a named converter that can be used in mappings.
+         *
+         * A converter must be be uniquely identified by name and can be defined at
+         * the class level and can be specified within an Entity,
+         * MappedSuperclass and Embeddable class.
+         *
+         * The usage of a SerializedConverter is always specified via the Converter annotation and
+         * is supported on a Basic, or ElementCollection mapping.
+         *
+         * @see org.eclipse.persistence.annotations.Serialize
+         * @see org.eclipse.persistence.sessions.serializers.Serializer
+         * @author James Sutherland
+         * @since EclipseLink 2.6
+         */
+        @Target({TYPE, METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface SerializedConverter {
+            /**
+             * (Required) Name this converter. The name should be unique across the
+             * whole persistence unit.
+             */
+            String name();
+
+            /**
+             * Allows a package name to be passed to the serializer.
+             * This is used by some serializers such as XML, JSON to initialize the
+             * JAXB context from the classes in the package or a jaxb.index file.
+             */
+            String serializerPackage() default "";
+
+            /**
+             * The serializer class to be used. This class must implement the
+             * org.eclipse.persistence.sessions.serializers.Serializer interface.
+             */
+            Class serializerClass() default JavaSerializer.class;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="serializer-class" type="xsd:string"/>
+    <xsd:attribute name="serializer-package" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="unique-constraint">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface UniqueConstraint {
+          String name() default "";
+          String[] columnNames();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column-name" type="xsd:string"
+                   maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="variable-one-to-one">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * Variable one to one mappings are used to represent a pointer
+         * references between a java object and an implementer of an interface.
+         * This mapping is usually represented by a single pointer (stored in an
+         * instance variable) between the source and target objects. In the
+         * relational database tables, these mappings are normally implemented
+         * using a foreign key and a type code.
+         *
+         * A VariableOneToOne can be specified within an Entity,
+         * MappedSuperclass and Embeddable class.
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface VariableOneToOne {
+          /**
+           * (Optional) The interface class that is the target of the
+           * association. If not specified it will be inferred from the type
+           * of the object being referenced.
+           */
+          Class targetInterface() default void.class;
+
+          /**
+           * (Optional) The operations that must be cascaded to the target of
+           * the association.
+           */
+          CascadeType[] cascade() default {};
+
+          /**
+           * (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 EAGER.
+           */
+          FetchType fetch() default EAGER;
+
+          /**
+           * (Optional) Whether the association is optional. If set to false
+           * then a non-null relationship must always exist.
+           */
+          boolean optional() default true;
+
+          /**
+           * (Optional) The discriminator column will hold the type
+           * indicators. If the DiscriminatorColumn is not specified, the name
+           * of the discriminator column defaults to "DTYPE" and the
+           * discriminator type to STRING.
+           */
+          DiscriminatorColumn discriminatorColumn() default @DiscriminatorColumn;
+
+          /**
+           * (Optional) The list of discriminator types that can be used with
+           * this VariableOneToOne. If none are specified then those entities
+           * within the persistence unit that implement the target interface
+           * will be added to the list of types. The discriminator type will
+           * default as follows:
+           *  - If DiscriminatorColumn type is STRING: Entity.name()
+           *  - If DiscriminatorColumn type is CHAR: First letter of the
+           *    Entity class
+           *  - If DiscriminatorColumn type is INTEGER: The next integer after
+           *    the highest integer explicitly added.
+           */
+          DiscriminatorClass[] discriminatorClasses() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="cascade" type="orm:cascade-type" minOccurs="0"/>
+      <xsd:element name="discriminator-column" type="orm:discriminator-column" minOccurs="0"/>
+      <xsd:element name="discriminator-class" type="orm:discriminator-class" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="join-column" type="orm:join-column" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="private-owned" type="orm:emptyType" minOccurs="0"/>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+      <xsd:element name="noncacheable" type="orm:emptyType" minOccurs="0"/>
+      <xsd:group ref="orm:partitioning-group"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="target-interface" type="xsd:string"/>
+    <xsd:attribute name="fetch" type="orm:fetch-type"/>
+    <xsd:attribute name="optional" type="xsd:boolean"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="orphan-removal" type="xsd:boolean"/>
+  </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="index" type="orm:eclipselink-index" minOccurs="0"/>
+      <xsd:choice minOccurs="0">
+        <xsd:element name="temporal" type="orm:temporal"/>
+        <xsd:element name="convert" type="orm:convert"/>
+      </xsd:choice>
+      <xsd:choice minOccurs="0">
+        <xsd:element name="converter" type="orm:converter"/>
+        <xsd:element name="type-converter" type="orm:type-converter"/>
+        <xsd:element name="object-type-converter" type="orm:object-type-converter"/>
+        <xsd:element name="serialized-converter" type="orm:serialized-converter"/>
+        <xsd:element name="struct-converter" type="orm:struct-converter"/>
+      </xsd:choice>
+      <xsd:element name="property" type="orm:property" minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="access-methods" type="orm:access-methods" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+    <xsd:attribute name="mutable" type="xsd:boolean"/>
+    <xsd:attribute name="attribute-type" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="write-transformer">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Annotation for org.eclipse.persistence.mappings.TransformationMapping.
+         * WriteTransformer defines transformation of the attribute value to a
+         * single database column value (column is specified in the
+         * WriteTransformer).
+         *
+         * A single WriteTransformer may be specified directly on the method or
+         * attribute. Multiple WriteTransformers should be wrapped into
+         * WriteTransformers annotation. No WriteTransformers specified for
+         * read-only mapping. Unless the TransformationMapping is write-only, it
+         * should have a ReadTransformer, it defines transformation of database
+         * column(s) value(s)into attribute value.
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface WriteTransformer {
+            /**
+             * User-defined class that must implement the
+             * org.eclipse.persistence.mappings.transformers.FieldTransformer
+             * interface. The class will be instantiated, its buildFieldValue
+             * will be used to create the value to be written into the database
+             * column. Note that for ddl generation and returning to be
+             * supported the method buildFieldValue in the class should be
+             * defined to return the relevant Java type, not just Object as
+             * defined in the interface, for instance:
+             * public Time buildFieldValue(Object instance, String fieldName, Session session).
+             * Either transformerClass or method must be specified, but not both.
+             */
+            Class transformerClass() default void.class;
+
+            /**
+             * The mapped class must have a method with this name which returns
+             * a value to be written into the database column.
+             * Note that for ddl generation and returning to be supported the
+             * method should be defined to return a particular type, not just
+             * Object, for instance:
+             * public Time getStartTime().
+             * The method may require a Transient annotation to avoid being
+             * mapped as Basic by default.
+             * Either transformerClass or method must be specified, but not both.
+             */
+            String method() default "";
+
+            /**
+             * Specify here the column into which the value should be written.
+             * The only case when this could be skipped is if a single
+             * WriteTransformer annotates an attribute - the attribute's name
+             * will be used as a column name.
+             */
+            Column column() default @Column;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column" type="orm:column"/>
+    </xsd:sequence>
+    <xsd:attribute name="transformer-class" type="xsd:string"/>
+    <xsd:attribute name="method" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="batch-fetch">
+    <xsd:annotation>
+      <xsd:documentation>
+        /**
+         * A BatchFetch annotation can be used on any relationship mapping,
+         * (OneToOne, ManyToOne, OneToMany, ManyToMany, ElementCollection, BasicCollection, BasicMap).
+         * It allows the related objects to be batch read in a single query.
+         * Batch fetching can also be set at the query level, and it is
+         * normally recommended to do so as all queries may not require batching.
+         *
+         * @author James Sutherland
+         * @since EclipseLink 2.1
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface BatchFetch {
+            /**
+             * (Optional) The type of batch-fetch to use.
+             * Either JOIN, EXISTS or IN.
+             * JOIN is the default.
+             */
+            BatchFetchType value() default BatchFetchType.JOIN;
+
+            /**
+             * Define the default batch fetch size.
+             * This is only used for IN type batch reading and defines
+             * the number of keys used in each IN clause.
+             * The default size is 256, or the query's pageSize for cursor queries.
+             */
+            int size() default -1;
+        }
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="type" type="orm:batch-fetch-type"/>
+    <xsd:attribute name="size" type="xsd:integer"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="no-sql">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * An NoSQL (No SQL, or Not Only SQL) database is any non-relational data source.
+         * This can include:
+         *
+         * NoSQL databases such as Oracle NoSQL, MongoDB, etc.
+         * XML databases
+         * Distributed cache stores such as Oracle Coherence
+         * Object databases
+         * Legacy databases, gateways and transaction system such as VSAM, ADA, CICS, IMS, MQSeries, Tuxedo, etc.
+         * ERP systems, such as SAP
+         *
+         * EclipseLink allows NoSQL data to be mapped to objects, and accessed through JPA and EclipseLink's APIs.
+         *
+         * Entity and Embeddable objects can be used to map NoSQL data.
+         * Most NoSQL data is hierarchical in form so usage of embeddable objects is common.
+         * Some NoSQL adaptors support XML data, so NoSQL mapped objects can use XML mappings when
+         * mapping to XML.
+         *
+         * EclipseLink support NoSQL data access through the JavaEE Connector Architecture.
+         * A JCA adaptor is required to map NoSQL data, this may be provided by EclipseLink,
+         * provided by a third party such as Attunity, or custom built.
+         *
+         * @see org.eclipse.persistence.eis.EISDescriptor
+         * @author James Sutherland
+         * @since EclipseLink 2.4
+         */
+        @Target({TYPE})
+        @Retention(RUNTIME)
+        public @interface NoSql {
+            /**
+             * (Required) The database name of the database structure type.
+             */
+            String dataType() default "";
+
+            /**
+             * (Optional) Defines the order of the fields contained in the database structure type.
+             */
+            DataFormatType dataFormat() default DataFormatType.XML;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="data-type" type="xsd:string"/>
+    <xsd:attribute name="data-format" type="orm:data-format-type"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:simpleType name="data-format-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Used to configure the data format type for an EIS descriptor.
+         *
+         * @see NoSql
+         * @see org.eclipse.persistence.eis.EISDescriptor#setDataFormat(String)
+         * @author James Sutherland
+         * @since EclipseLink 2.4
+         */
+        public enum DataFormatType {
+            /**
+             * XML data is used.  Objects are converted to XML.
+             * This is the default data format.
+             */
+            XML,
+
+            /**
+             * JCA IndexedRecords are used, objects data is decomposed into an array of field values.
+             */
+            INDEXED,
+
+            /**
+             * JCA MappedRecords are used, objects data is decomposed into a Map of key/value pairs.
+             */
+            MAPPED
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+      <xsd:restriction base="xsd:token">
+        <xsd:enumeration value="XML"/>
+        <xsd:enumeration value="INDEXED"/>
+        <xsd:enumeration value="MAPPED"/>
+     </xsd:restriction>
+  </xsd:simpleType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="field">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Define a structured data type's field name for an object mapped to NoSql data.
+         * This is a generic form of the @Column annotation, which is not specific to relational databases.
+         * It can be use to map EIS and NoSQL data.
+         *
+         * @see NoSql
+         * @author James Sutherland
+         * @since EclipseLink 2.4
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface Field {
+            /**
+             * (Optional) The data type's name of the field.
+             */
+            String name() default "";
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+  <xsd:complexType name="join-field">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        /**
+         * Define a structured data type's foreign key field for an object mapped to NoSql data.
+         * This is a generic form of the @JoinColumn annotation, which is not specific to relational databases.
+         * It can be use to map EIS and NoSQL data.
+         *
+         * @see NoSql
+         * @author James Sutherland
+         * @since EclipseLink 2.4
+         */
+        @Target({METHOD, FIELD})
+        @Retention(RUNTIME)
+        public @interface JoinField {
+            /**
+             * (Optional) The name of the foreign key/id reference field in the source record.
+             */
+            String name() default "";
+
+            /**
+             * (Optional) The name of the id field in the target record.
+             */
+            String referencedFieldName() default "";
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="referenced-field-name" type="xsd:string"/>
+  </xsd:complexType>
+
+  <!-- **************************************************** -->
+
+</xsd:schema>
+
+
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/orm_3_1.xsd b/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/orm_3_1.xsd
new file mode 100644
index 0000000..f233261
--- /dev/null
+++ b/jpa/org.eclipse.persistence.jpa/src/main/resources/org/eclipse/persistence/jpa/orm_3_1.xsd
@@ -0,0 +1,2325 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
+
+    This program and the accompanying materials are made available under the
+    terms of the Eclipse Public License v. 2.0 which is available at
+    http://www.eclipse.org/legal/epl-2.0,
+    or the Eclipse Distribution License v. 1.0 which is available at
+    http://www.eclipse.org/org/documents/edl-v10.php.
+
+    SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+
+-->
+
+<!-- Jakarta Persistence API object/relational mapping file schema -->
+<xsd:schema targetNamespace="https://jakarta.ee/xml/ns/persistence/orm" 
+  xmlns:orm="https://jakarta.ee/xml/ns/persistence/orm" 
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
+  elementFormDefault="qualified" 
+  attributeFormDefault="unqualified" 
+  version="3.1">
+
+  <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.
+
+       Object/relational mapping files must indicate the object/relational
+       mapping file schema by using the persistence namespace:
+
+       https://jakarta.ee/xml/ns/persistence/orm
+
+       and indicate the version of the schema by
+       using the version element as shown below:
+
+      <entity-mappings xmlns="https://jakarta.ee/xml/ns/persistence/orm"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence/orm
+          https://jakarta.ee/xml/ns/persistence/orm/orm_3_1.xsd"
+        version="3.1">
+          ...
+      </entity-mappings>
+
+
+     ]]></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 a 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, converter, named-query,
+        named-native-query, named-stored-procedure-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 undefined to have
+        more than one named-query, named-native-query, sql-result-set-mapping,
+        or named-stored-procedure-query of the same name in the same 
+        or different mapping files in a persistence unit.  It is also
+        undefined to have more than one converter for the same target
+        type 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"/>
+        <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="named-stored-procedure-query" 
+                     type="orm:named-stored-procedure-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:element name="converter" type="orm:converter" 
+                     minOccurs="0" maxOccurs="unbounded"/>
+      </xsd:sequence>
+      <xsd:attribute name="version" type="orm:versionType" 
+                     fixed="3.1" 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,
+        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="description" type="xsd:string" minOccurs="0"/>
+      <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="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, secondary tables, join
+            tables, collection tables, sequence generators, and table 
+            generators that apply to the persistence unit
+        catalog - Used as the catalog for all tables, secondary tables, join
+            tables, collection tables, sequence generators, and table 
+            generators that apply to the persistence unit
+        delimited-identifiers - Used to treat database identifiers as
+            delimited identifiers.
+        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 all 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="description" 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="delimited-identifiers" type="orm:emptyType" 
+                     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:sequence>
+        <xsd:element name="primary-key-join-column" 
+                     type="orm:primary-key-join-column" 
+                     minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="primary-key-foreign-key" 
+                     type="orm:foreign-key" 
+                     minOccurs="0"/>
+      </xsd:sequence>
+      <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="named-stored-procedure-query"
+                   type="orm:named-stored-procedure-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="convert" type="orm:convert"
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="named-entity-graph" type="orm:named-entity-graph"
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <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="cacheable" type="xsd:boolean"/>
+    <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
+  </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="association-override">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface AssociationOverride {
+          String name();
+          JoinColumn[] joinColumns() default{};
+          JoinTable joinTable() default @JoinTable;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:choice>
+        <xsd:sequence>
+          <xsd:element name="join-column" type="orm:join-column"
+                       minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="foreign-key" type="orm:foreign-key" 
+                       minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:element name="join-table" type="orm:join-table"
+                     minOccurs="0"/>
+      </xsd:choice>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <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="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="column" type="orm:column"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+  </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:element name="description" type="xsd:string" minOccurs="0"/>
+      <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="element-collection" type="orm:element-collection" 
+                   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: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:element name="convert" type="orm:convert" minOccurs="0"/>
+      </xsd:choice>
+    </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="access" type="orm:access-type"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="cascade-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH, DETACH};
+
+      </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:element name="cascade-detach" type="orm:emptyType"
+                   minOccurs="0"/>
+    </xsd:sequence>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="collection-table">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface CollectionTable {
+          String name() default "";
+          String catalog() default "";
+          String schema() default "";
+          JoinColumn[] joinColumns() default {};
+          UniqueConstraint[] uniqueConstraints() default {};
+          Index[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:sequence>
+        <xsd:element name="join-column" type="orm:join-column" 
+                     minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="foreign-key" type="orm:foreign-key" 
+                     minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" 
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 
+                   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="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="column-result">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface ColumnResult {
+          String name();
+          Class type() default void.class;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="class" type="xsd:string"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:simpleType name="constraint-mode">
+    <xsd:annotation>
+      <xsd:documentation>
+
+       public enum ConstraintMode {CONSTRAINT, NO_CONSTRAINT, PROVIDER_DEFAULT};
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="CONSTRAINT"/>
+      <xsd:enumeration value="NO_CONSTRAINT"/>
+      <xsd:enumeration value="PROVIDER_DEFAULT"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+<!-- **************************************************** -->
+
+
+  <xsd:complexType name="constructor-result">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface ConstructorResult {
+          Class targetClass();
+          ColumnResult[] columns();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column" type="orm:column-result" 
+                   maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="target-class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="convert">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface Convert {
+          Class converter() default void.class;
+          String attributeName() default "";
+          boolean disableConversion() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="converter" type="xsd:string"/>
+    <xsd:attribute name="attribute-name" type="xsd:string"/>
+    <xsd:attribute name="disable-conversion" type="xsd:boolean"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="converter">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface Converter {
+          boolean autoApply() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+    <xsd:attribute name="auto-apply" type="xsd:boolean"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <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: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: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:complexType name="element-collection">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface ElementCollection {
+          Class targetClass() default void.class;
+          FetchType fetch() default LAZY;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:choice>
+        <xsd:element name="order-by" type="orm:order-by"
+                     minOccurs="0"/>
+        <xsd:element name="order-column" type="orm:order-column"
+                     minOccurs="0"/>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:element name="map-key" type="orm:map-key"
+                     minOccurs="0"/>
+        <xsd:sequence>
+          <xsd:element name="map-key-class" type="orm:map-key-class"
+                       minOccurs="0"/>
+          <xsd:choice>
+            <xsd:element name="map-key-temporal"
+                         type="orm:temporal"
+                         minOccurs="0"/>
+            <xsd:element name="map-key-enumerated"
+                         type="orm:enumerated"
+                         minOccurs="0"/>
+            <xsd:sequence>
+               <xsd:element name="map-key-attribute-override"
+                            type="orm:attribute-override"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element name="map-key-convert" type="orm:convert"
+                            minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+          </xsd:choice>
+          <xsd:choice>
+            <xsd:element name="map-key-column"
+                         type="orm:map-key-column"
+                         minOccurs="0"/>
+            <xsd:sequence>
+              <xsd:element name="map-key-join-column"
+                           type="orm:map-key-join-column"
+                           minOccurs="0" maxOccurs="unbounded"/>
+              <xsd:element name="map-key-foreign-key" 
+                           type="orm:foreign-key" 
+                           minOccurs="0"/>
+            </xsd:sequence>
+          </xsd:choice>
+        </xsd:sequence>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:sequence>
+          <xsd:element name="column" type="orm:column" minOccurs="0"/>
+          <xsd:choice>
+            <xsd:element name="temporal"
+                         type="orm:temporal"
+                         minOccurs="0"/>
+            <xsd:element name="enumerated"
+                         type="orm:enumerated"
+                         minOccurs="0"/>
+            <xsd:element name="lob"
+                         type="orm:lob"
+                         minOccurs="0"/>
+          </xsd:choice>
+        </xsd:sequence>
+        <xsd:sequence>
+          <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="convert" type="orm:convert"
+                       minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+      </xsd:choice>
+      <xsd:element name="collection-table" type="orm:collection-table"
+                     minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="target-class" type="xsd:string"/>
+    <xsd:attribute name="fetch" type="orm:fetch-type"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+</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="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="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="element-collection" type="orm:element-collection" 
+                   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: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:element name="association-override" 
+                   type="orm:association-override"
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="convert" type="orm:convert"
+                   minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+  </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:attribute name="access" type="orm:access-type"/>
+  </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="description" type="xsd:string" 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:sequence>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <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-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: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: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="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="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="foreign-key">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface ForeignKey {
+          String name() default "";
+	  ConstraintMode value() default CONSTRAINT;
+          String foreign-key-definition() default "";
+
+        Note that the elements that embed the use of the annotation
+        default this use as @ForeignKey(PROVIDER_DEFAULT).
+
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="constraint-mode" type="orm:constraint-mode"/>
+    <xsd:attribute name="foreign-key-definition" type="xsd:string"/>
+  </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:simpleType name="generation-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum GenerationType { TABLE, SEQUENCE, IDENTITY, UUID, 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="UUID"/>
+      <xsd:enumeration value="AUTO"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+<!-- **************************************************** -->
+
+  <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:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+  </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="index">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface Index {
+          String name() default "";
+          String columnList();
+          boolean unique() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="column-list" type="xsd:string" use="required"/>
+    <xsd:attribute name="unique" type="xsd:boolean"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <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: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 "";
+          ForeignKey foreignKey() default @ForeignKey();
+        }
+
+      </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:complexType name="join-table">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface JoinTable {
+          String name() default "";
+          String catalog() default "";
+          String schema() default "";
+          JoinColumn[] joinColumns() default {};
+          JoinColumn[] inverseJoinColumns() default {};
+          UniqueConstraint[] uniqueConstraints() default {};
+          Index[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:sequence>
+        <xsd:element name="join-column" type="orm:join-column" 
+                     minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="foreign-key" type="orm:foreign-key" 
+                     minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:sequence>
+        <xsd:element name="inverse-join-column" type="orm:join-column" 
+                     minOccurs="0" maxOccurs="unbounded"/>
+        <xsd:element name="inverse-foreign-key" type="orm:foreign-key" 
+                     minOccurs="0"/>
+      </xsd:sequence>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" 
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 
+                   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="lob">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface Lob {}
+
+      </xsd:documentation>
+    </xsd:annotation>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:simpleType name="lock-mode-type">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum LockModeType { READ, WRITE, OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT, PESSIMISTIC_READ, PESSIMISTIC_WRITE, PESSIMISTIC_FORCE_INCREMENT, NONE};
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="READ"/>
+      <xsd:enumeration value="WRITE"/>
+      <xsd:enumeration value="OPTIMISTIC"/>
+      <xsd:enumeration value="OPTIMISTIC_FORCE_INCREMENT"/>
+      <xsd:enumeration value="PESSIMISTIC_READ"/>
+      <xsd:enumeration value="PESSIMISTIC_WRITE"/>
+      <xsd:enumeration value="PESSIMISTIC_FORCE_INCREMENT"/>
+      <xsd:enumeration value="NONE"/>
+
+    </xsd:restriction>
+  </xsd:simpleType>
+
+<!-- **************************************************** -->
+
+<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:choice>
+        <xsd:element name="order-by" type="orm:order-by"
+                   minOccurs="0"/>
+        <xsd:element name="order-column" type="orm:order-column"
+                   minOccurs="0"/>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:element name="map-key" type="orm:map-key"
+                   minOccurs="0"/>
+        <xsd:sequence>
+          <xsd:element name="map-key-class" type="orm:map-key-class"
+                   minOccurs="0"/>
+          <xsd:choice>
+            <xsd:element name="map-key-temporal"
+                         type="orm:temporal"
+                         minOccurs="0"/>
+            <xsd:element name="map-key-enumerated"
+                         type="orm:enumerated"
+                         minOccurs="0"/>
+            <xsd:sequence>
+               <xsd:element name="map-key-attribute-override"
+                            type="orm:attribute-override"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element name="map-key-convert" type="orm:convert"
+                            minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+          </xsd:choice>
+          <xsd:choice>
+            <xsd:element name="map-key-column" type="orm:map-key-column"
+                   minOccurs="0"/>
+            <xsd:sequence>
+              <xsd:element name="map-key-join-column"
+                     type="orm:map-key-join-column"
+                     minOccurs="0" maxOccurs="unbounded"/>
+              <xsd:element name="map-key-foreign-key" 
+                           type="orm:foreign-key" 
+                           minOccurs="0"/>
+            </xsd:sequence>
+          </xsd:choice>
+        </xsd:sequence>
+      </xsd:choice>
+      <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="access" type="orm:access-type"/>
+    <xsd:attribute name="mapped-by" type="xsd:string"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <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:sequence>
+          <xsd:element name="join-column" type="orm:join-column" 
+                       minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="foreign-key" type="orm:foreign-key" 
+                       minOccurs="0"/>
+        </xsd:sequence>
+        <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="access" type="orm:access-type"/>
+    <xsd:attribute name="maps-id" type="xsd:string"/>
+    <xsd:attribute name="id" type="xsd:boolean"/>
+  </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:complexType name="map-key-class">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface MapKeyClass {
+          Class value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="map-key-column">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface MapKeyColumn {
+          String name() default "";
+          boolean unique() default false;
+          boolean nullable() default false;
+          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="map-key-join-column">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface MapKeyJoinColumn {
+          String name() default "";
+          String referencedColumnName() default "";
+          boolean unique() default false;
+          boolean nullable() default false;
+          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: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="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:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="named-attribute-node">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface NamedAttributeNode {
+          String value();
+          String subgraph() default "";
+          String keySubgraph() default "";
+        }
+ 
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="subgraph" type="xsd:string"/>
+    <xsd:attribute name="key-subgraph" type="xsd:string"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="named-entity-graph">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface NamedEntityGraph {
+          String name() default "";
+          NamedAttributeNode[] attributeNodes() default {};
+          boolean includeAllAttributes() default false;
+          NamedSubgraph[] subgraphs() default {};
+          NamedSubGraph[] subclassSubgraphs() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="named-attribute-node" 
+                   type="orm:named-attribute-node" 
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+      <xsd:element name="subgraph" 
+                   type="orm:named-subgraph" 
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+      <xsd:element name="subclass-subgraph" 
+                   type="orm:named-subgraph" 
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="include-all-attributes" type="xsd:boolean"/>
+  </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="description" type="xsd:string" minOccurs="0"/>
+      <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="named-query">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface NamedQuery {
+          String name();
+          String query();
+          LockModeType lockMode() default NONE;
+          QueryHint[] hints() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="query" type="xsd:string"/>
+      <xsd:element name="lock-mode" type="orm:lock-mode-type" minOccurs="0"/>
+      <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-stored-procedure-query">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface NamedStoredProcedureQuery {
+          String name();
+          String procedureName();
+          StoredProcedureParameter[] parameters() default {};
+          Class[] resultClasses() default {};
+          String[] resultSetMappings() default{};
+          QueryHint[] hints() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="parameter" 
+                   type="orm:stored-procedure-parameter" 
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="result-class" type="xsd:string"  
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="result-set-mapping" type="xsd:string"
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <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="procedure-name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="named-subgraph">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface NamedSubgraph {
+          String name();
+          Class type() default void.class;
+          NamedAttributeNode[] attributeNodes();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="named-attribute-node" 
+                   type="orm:named-attribute-node" 
+                   minOccurs="0"
+                   maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="class" type="xsd:string"/>
+  </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:choice>
+        <xsd:element name="order-by" type="orm:order-by"
+                   minOccurs="0"/>
+        <xsd:element name="order-column" type="orm:order-column"
+                   minOccurs="0"/>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:element name="map-key" type="orm:map-key"
+                   minOccurs="0"/>
+        <xsd:sequence>
+          <xsd:element name="map-key-class" type="orm:map-key-class"
+                   minOccurs="0"/>
+          <xsd:choice>
+            <xsd:element name="map-key-temporal"
+                         type="orm:temporal"
+                         minOccurs="0"/>
+            <xsd:element name="map-key-enumerated"
+                         type="orm:enumerated"
+                         minOccurs="0"/>
+            <xsd:sequence>
+               <xsd:element name="map-key-attribute-override"
+                            type="orm:attribute-override"
+                            minOccurs="0" maxOccurs="unbounded"/>
+               <xsd:element name="map-key-convert" type="orm:convert"
+                            minOccurs="0" maxOccurs="unbounded"/>
+            </xsd:sequence>
+          </xsd:choice>
+          <xsd:choice>
+            <xsd:element name="map-key-column" type="orm:map-key-column"
+                   minOccurs="0"/>
+            <xsd:sequence>
+              <xsd:element name="map-key-join-column"
+                           type="orm:map-key-join-column"
+                           minOccurs="0" maxOccurs="unbounded"/>
+              <xsd:element name="map-key-foreign-key" 
+                           type="orm:foreign-key" 
+                           minOccurs="0"/>
+            </xsd:sequence>
+          </xsd:choice>
+        </xsd:sequence>
+      </xsd:choice>
+      <xsd:choice>
+        <xsd:element name="join-table" type="orm:join-table"
+                     minOccurs="0"/>
+        <xsd:sequence>
+          <xsd:element name="join-column" type="orm:join-column"
+                       minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="foreign-key" type="orm:foreign-key" 
+                       minOccurs="0"/>
+        </xsd:sequence>
+      </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="access" type="orm:access-type"/>
+    <xsd:attribute name="mapped-by" type="xsd:string"/>
+    <xsd:attribute name="orphan-removal" type="xsd:boolean"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <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 "";
+          boolean orphanRemoval() default false;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:choice>
+        <xsd:sequence>
+          <xsd:element name="primary-key-join-column" 
+                       type="orm:primary-key-join-column" 
+                       minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="primary-key-foreign-key" 
+                       type="orm:foreign-key" 
+                       minOccurs="0"/>
+        </xsd:sequence>
+        <xsd:sequence>
+          <xsd:element name="join-column" type="orm:join-column" 
+                       minOccurs="0" maxOccurs="unbounded"/>
+          <xsd:element name="foreign-key" type="orm:foreign-key" 
+                       minOccurs="0"/>
+        </xsd:sequence>
+        <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="access" type="orm:access-type"/>
+    <xsd:attribute name="mapped-by" type="xsd:string"/>
+    <xsd:attribute name="orphan-removal" type="xsd:boolean"/>
+    <xsd:attribute name="maps-id" type="xsd:string"/>
+    <xsd:attribute name="id" type="xsd:boolean"/>
+</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="order-column">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface OrderColumn {
+          String name() default "";
+          boolean nullable() default true;
+          boolean insertable() default true;
+          boolean updatable() default true;
+          String columnDefinition() default "";
+         }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <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:complexType>
+
+<!-- **************************************************** -->
+
+  <xsd:simpleType name="parameter-mode">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        public enum ParameterMode { IN, INOUT, OUT, REF_CURSOR};
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base="xsd:token">
+      <xsd:enumeration value="IN"/>
+      <xsd:enumeration value="INOUT"/>
+      <xsd:enumeration value="OUT"/>
+      <xsd:enumeration value="REF_CURSOR"/>
+    </xsd:restriction>
+  </xsd:simpleType>
+
+<!-- **************************************************** -->
+
+  <xsd:complexType name="post-load">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({METHOD}) @Retention(RUNTIME)
+        public @interface PostLoad {}
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="method-name" 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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <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:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+  </xsd:complexType>
+
+<!-- **************************************************** -->
+
+  <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:complexType name="query-hint">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME) 
+        public @interface QueryHint {
+          String name();
+          String value();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="value" type="xsd:string" use="required"/>
+  </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 {};
+          Index[] indexes() default {};
+         }
+
+       </xsd:documentation>
+     </xsd:annotation>
+     <xsd:sequence>
+       <xsd:sequence>
+         <xsd:element name="primary-key-join-column" 
+                      type="orm:primary-key-join-column" 
+                      minOccurs="0" maxOccurs="unbounded"/>
+         <xsd:element name="primary-key-foreign-key" 
+                      type="orm:foreign-key" 
+                      minOccurs="0"/>
+       </xsd:sequence>
+       <xsd:element name="unique-constraint" type="orm:unique-constraint" 
+                    minOccurs="0" maxOccurs="unbounded"/>
+       <xsd:element name="index" type="orm:index" 
+                    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="sequence-generator">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+        public @interface SequenceGenerator {
+          String name();
+          String sequenceName() default "";
+          String catalog() default "";
+          String schema() default "";
+          int initialValue() default 1;
+          int allocationSize() default 50;
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="sequence-name" type="xsd:string"/>
+    <xsd:attribute name="catalog" type="xsd:string"/>
+    <xsd:attribute name="schema" type="xsd:string"/>
+    <xsd:attribute name="initial-value" type="xsd:int"/>
+    <xsd:attribute name="allocation-size" type="xsd:int"/>
+  </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 {};
+          ConstructorResult[] classes() default{};
+          ColumnResult[] columns() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="entity-result" type="orm:entity-result" 
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="constructor-result" type="orm:constructor-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="stored-procedure-parameter">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({TYPE}) @Retention(RUNTIME)
+        public @interface StoredProcedureParameter {
+          String name() default "";
+          ParameterMode mode() default ParameterMode.IN;
+          Class type();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" 
+                   minOccurs="0"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+    <xsd:attribute name="class" type="xsd:string" use="required"/>
+    <xsd:attribute name="mode" type="orm:parameter-mode"/>
+  </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 {};
+          Index[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" 
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 
+                   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="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 {};
+          Indexes[] indexes() default {};
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="unique-constraint" type="orm:unique-constraint" 
+                   minOccurs="0" maxOccurs="unbounded"/>
+      <xsd:element name="index" type="orm:index" 
+                   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: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: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="unique-constraint">
+    <xsd:annotation>
+      <xsd:documentation>
+
+        @Target({}) @Retention(RUNTIME)
+        public @interface UniqueConstraint {
+          String name() default "";
+          String[] columnNames();
+        }
+
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:sequence>
+      <xsd:element name="column-name" type="xsd:string" 
+                   maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string"/>
+  </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:sequence>
+    <xsd:attribute name="name" type="xsd:string" use="required"/>
+    <xsd:attribute name="access" type="orm:access-type"/>
+  </xsd:complexType>
+
+</xsd:schema>