This is an automated email from the ASF dual-hosted git repository.

dschneider pushed a commit to branch feature/GEODE-6291
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/GEODE-6291 by this 
push:
     new 1fcae0f  added field-mapping subelement to region-mapping in xsd
1fcae0f is described below

commit 1fcae0f21c5945bad0f3d6160a882015395e07d1
Author: Darrel Schneider <[email protected]>
AuthorDate: Fri Jan 18 15:31:13 2019 -0800

    added field-mapping subelement to region-mapping in xsd
---
 .../geode/connectors/jdbc/internal/SqlHandler.java |   4 +-
 .../jdbc/internal/SqlToPdxInstanceCreator.java     |   2 +-
 .../jdbc/internal/cli/CreateMappingCommand.java    |   4 +-
 .../jdbc/internal/configuration/FieldMapping.java  | 122 ++++++++++++
 .../jdbc/internal/configuration/RegionMapping.java | 209 +++++++++++++--------
 .../connectors/jdbc/internal/xml/ElementType.java  |  21 +++
 .../xml/JdbcConnectorServiceXmlParser.java         |   5 +-
 .../geode.apache.org/schema/jdbc/jdbc-1.0.xsd      |  14 ++
 .../jdbc/internal/RegionMappingTest.java           | 147 +++------------
 .../connectors/jdbc/internal/SqlHandlerTest.java   |  58 +++---
 .../jdbc/internal/SqlToPdxInstanceCreatorTest.java |  48 ++---
 .../jdbc/internal/xml/ElementTypeTest.java         |  46 ++++-
 12 files changed, 423 insertions(+), 257 deletions(-)

diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
index 799fd95..7185b6c 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
@@ -273,7 +273,7 @@ public class SqlHandler {
             + keyColumnNames.size() + " fields but has " + fieldNames.size() + 
" fields.");
       }
       for (String fieldName : fieldNames) {
-        String columnName = regionMapping.getColumnNameForField(fieldName, 
tableMetaData);
+        String columnName = regionMapping.getColumnNameForField(fieldName);
         if (!keyColumnNames.contains(columnName)) {
           throw new JdbcConnectorException("The key \"" + key + "\" has the 
field \"" + fieldName
               + "\" which does not match any of the key columns: " + 
keyColumnNames);
@@ -290,7 +290,7 @@ public class SqlHandler {
       RegionMapping regionMapping, PdxInstance value) {
     List<ColumnData> result = new ArrayList<>();
     for (String fieldName : value.getFieldNames()) {
-      String columnName = regionMapping.getColumnNameForField(fieldName, 
tableMetaData);
+      String columnName = regionMapping.getColumnNameForField(fieldName);
       if (tableMetaData.getKeyColumnNames().contains(columnName)) {
         continue;
       }
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
index aa4f3ae..335dd85 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreator.java
@@ -55,7 +55,7 @@ class SqlToPdxInstanceCreator {
     final int columnCount = metaData.getColumnCount();
     for (int i = 1; i <= columnCount; i++) {
       String columnName = metaData.getColumnName(i);
-      String fieldName = regionMapping.getFieldNameForColumn(columnName, 
typeRegistry);
+      String fieldName = regionMapping.getFieldNameForColumn(columnName);
       FieldType fieldType = getFieldType(typeRegistry, fieldName);
       writeField(columnName, i, fieldName, fieldType);
     }
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
index e3764a5..1f9d475 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
@@ -134,8 +134,8 @@ public class CreateMappingCommand extends SingleGfshCommand 
{
     // The field mapping will have the following:
     // 1. pdx field name
     // 2. pdx field type (an instance of org.apache.geode.pdx.FieldType)
-    // 3. sql column name
-    // 4. sql column type (an instance of java.sql.JDBCType)
+    // 3. jdbc column name
+    // 4. jdbc column type (an instance of java.sql.JDBCType)
 
     // action
     Object[] arguments = new Object[] {mapping, synchronous};
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
new file mode 100644
index 0000000..3b633c4
--- /dev/null
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/FieldMapping.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.geode.connectors.jdbc.internal.configuration;
+
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+
+@SuppressWarnings("serial")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class FieldMapping implements Serializable {
+  @Override
+  public String toString() {
+    return "FieldMapping [pdxName=" + pdxName + ", pdxType=" + pdxType + ", 
jdbcName=" + jdbcName
+        + ", jdbcType=" + jdbcType + "]";
+  }
+
+  @XmlAttribute(name = "pdx-name")
+  private String pdxName;
+  @XmlAttribute(name = "pdx-type")
+  private String pdxType;
+  @XmlAttribute(name = "jdbc-name")
+  private String jdbcName;
+  @XmlAttribute(name = "jdbc-type")
+  private String jdbcType;
+
+  public FieldMapping() {}
+
+  public FieldMapping(String pdxName, String pdxType, String jdbcName, String 
jdbcType) {
+    this.pdxName = pdxName;
+    this.pdxType = pdxType;
+    this.jdbcName = jdbcName;
+    this.jdbcType = jdbcType;
+  }
+
+  public String getPdxName() {
+    return pdxName;
+  }
+
+  public void setPdxName(String value) {
+    this.pdxName = value;
+  }
+
+  public String getJdbcName() {
+    return jdbcName;
+  }
+
+  public void setJdbcName(String value) {
+    this.jdbcName = value;
+  }
+
+  @Override
+  public int hashCode() {
+    final int prime = 31;
+    int result = 1;
+    result = prime * result + ((jdbcName == null) ? 0 : jdbcName.hashCode());
+    result = prime * result + ((jdbcType == null) ? 0 : jdbcType.hashCode());
+    result = prime * result + ((pdxName == null) ? 0 : pdxName.hashCode());
+    result = prime * result + ((pdxType == null) ? 0 : pdxType.hashCode());
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null) {
+      return false;
+    }
+    if (getClass() != obj.getClass()) {
+      return false;
+    }
+    FieldMapping other = (FieldMapping) obj;
+    if (jdbcName == null) {
+      if (other.jdbcName != null) {
+        return false;
+      }
+    } else if (!jdbcName.equals(other.jdbcName)) {
+      return false;
+    }
+    if (jdbcType == null) {
+      if (other.jdbcType != null) {
+        return false;
+      }
+    } else if (!jdbcType.equals(other.jdbcType)) {
+      return false;
+    }
+    if (pdxName == null) {
+      if (other.pdxName != null) {
+        return false;
+      }
+    } else if (!pdxName.equals(other.pdxName)) {
+      return false;
+    }
+    if (pdxType == null) {
+      if (other.pdxType != null) {
+        return false;
+      }
+    } else if (!pdxType.equals(other.pdxType)) {
+      return false;
+    }
+    return true;
+  }
+
+}
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
index cc668df..f80606a 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/configuration/RegionMapping.java
@@ -14,14 +14,15 @@
  */
 package org.apache.geode.connectors.jdbc.internal.configuration;
 
-import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
+import java.util.Map;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlType;
@@ -30,9 +31,6 @@ import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.cache.configuration.XSDRootElement;
 import org.apache.geode.connectors.jdbc.JdbcConnectorException;
-import org.apache.geode.connectors.jdbc.internal.TableMetaDataView;
-import org.apache.geode.pdx.internal.PdxType;
-import org.apache.geode.pdx.internal.TypeRegistry;
 
 /**
  * <p>
@@ -45,6 +43,20 @@ import org.apache.geode.pdx.internal.TypeRegistry;
  * &lt;complexType>
  *   &lt;complexContent>
  *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType";>
+ *       &lt;sequence>
+ *         &lt;element name="field-mapping" maxOccurs="unbounded" 
minOccurs="0">
+ *           &lt;complexType>
+ *             &lt;simpleContent>
+ *               &lt;extension 
base="&lt;http://www.w3.org/2001/XMLSchema>string">
+ *                 &lt;attribute name="pdx-name" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
+ *                 &lt;attribute name="pdx-type" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
+ *                 &lt;attribute name="jdbc-name" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
+ *                 &lt;attribute name="jdbc-type" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
+ *               &lt;/extension>
+ *             &lt;/simpleContent>
+ *           &lt;/complexType>
+ *         &lt;/element>
+ *       &lt;/sequence>
  *       &lt;attribute name="data-source" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
  *       &lt;attribute name="table" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
  *       &lt;attribute name="pdx-name" 
type="{http://www.w3.org/2001/XMLSchema}string"; />
@@ -59,12 +71,18 @@ import org.apache.geode.pdx.internal.TypeRegistry;
  */
 @Experimental
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "")
+@XmlType(name = "", propOrder = {"fieldMapping"})
 @XmlRootElement(name = "mapping", namespace = 
"http://geode.apache.org/schema/jdbc";)
 @XSDRootElement(namespace = "http://geode.apache.org/schema/jdbc";,
     schemaLocation = "http://geode.apache.org/schema/jdbc/jdbc-1.0.xsd";)
 public class RegionMapping implements CacheElement {
 
+  @XmlElement(name = "field-mapping", namespace = 
"http://geode.apache.org/schema/jdbc";)
+  protected final List<FieldMapping> fieldMappings = new ArrayList<>();
+  @XmlTransient
+  private final Map<String, FieldMapping> pdxToFieldMappings = new HashMap<>();
+  @XmlTransient
+  private final Map<String, FieldMapping> jdbcToFieldMappings = new 
HashMap<>();
   @XmlAttribute(name = "data-source")
   protected String dataSourceName;
   @XmlAttribute(name = "table")
@@ -152,88 +170,117 @@ public class RegionMapping implements CacheElement {
     return tableName;
   }
 
-  public String getColumnNameForField(String fieldName, TableMetaDataView 
tableMetaDataView) {
-    Set<String> columnNames = tableMetaDataView.getColumnNames();
-    if (columnNames.contains(fieldName)) {
-      return fieldName;
-    }
-
-    List<String> ignoreCaseMatch = columnNames.stream().filter(c -> 
c.equalsIgnoreCase(fieldName))
-        .collect(Collectors.toList());
-    if (ignoreCaseMatch.size() > 1) {
-      throw new JdbcConnectorException(
-          "The SQL table has at least two columns that match the PDX field: " 
+ fieldName);
-    }
-
-    if (ignoreCaseMatch.size() == 1) {
-      return ignoreCaseMatch.get(0);
-    }
-
-    // there is no match either in the configured mapping or the table columns
-    return fieldName;
+  public void addFieldMapping(FieldMapping value) {
+    this.fieldMappings.add(value);
+    this.pdxToFieldMappings.put(value.getPdxName(), value);
+    this.jdbcToFieldMappings.put(value.getJdbcName(), value);
   }
 
-  public String getFieldNameForColumn(String columnName, TypeRegistry 
typeRegistry) {
-    Set<PdxType> pdxTypes = getPdxTypesForClassName(typeRegistry);
-    String fieldName = findExactMatch(columnName, pdxTypes);
-    if (fieldName == null) {
-      fieldName = findCaseInsensitiveMatch(columnName, pdxTypes);
-    }
-    return fieldName;
+  public FieldMapping getFieldMappingByPdxName(String pdxName) {
+    return this.pdxToFieldMappings.get(pdxName);
   }
 
-  private Set<PdxType> getPdxTypesForClassName(TypeRegistry typeRegistry) {
-    Set<PdxType> pdxTypes = typeRegistry.getPdxTypesForClassName(getPdxName());
-    if (pdxTypes.isEmpty()) {
-      throw new JdbcConnectorException(
-          "The class " + getPdxName() + " has not been pdx serialized.");
-    }
-    return pdxTypes;
+  public FieldMapping getFieldMappingByJdbcName(String jdbcName) {
+    return this.jdbcToFieldMappings.get(jdbcName);
   }
 
-  /**
-   * Given a column name and a set of pdx types, find the field name in those 
types that match,
-   * ignoring case, the column name.
-   *
-   * @return the matching field name or null if no match
-   * @throws JdbcConnectorException if no fields match
-   * @throws JdbcConnectorException if more than one field matches
-   */
-  private String findCaseInsensitiveMatch(String columnName, Set<PdxType> 
pdxTypes) {
-    HashSet<String> matchingFieldNames = new HashSet<>();
-    for (PdxType pdxType : pdxTypes) {
-      for (String existingFieldName : pdxType.getFieldNames()) {
-        if (existingFieldName.equalsIgnoreCase(columnName)) {
-          matchingFieldNames.add(existingFieldName);
-        }
-      }
-    }
-    if (matchingFieldNames.isEmpty()) {
-      throw new JdbcConnectorException("The class " + getPdxName()
-          + " does not have a field that matches the column " + columnName);
-    } else if (matchingFieldNames.size() > 1) {
-      throw new JdbcConnectorException(
-          "Could not determine what pdx field to use for the column name " + 
columnName
-              + " because the pdx fields " + matchingFieldNames + " all match 
it.");
+  public String getColumnNameForField(String fieldName) {
+    FieldMapping fieldMapping = getFieldMappingByPdxName(fieldName);
+    if (fieldMapping != null) {
+      return fieldMapping.getJdbcName();
     }
-    return matchingFieldNames.iterator().next();
+    throw new JdbcConnectorException(
+        "A field mapping for the pdx field \"" + fieldName + "\" does not 
exist.");
+    // TODO use this code when we create the field mapping
+    // Set<String> columnNames = tableMetaDataView.getColumnNames();
+    // if (columnNames.contains(fieldName)) {
+    // return fieldName;
+    // }
+    //
+    // List<String> ignoreCaseMatch = columnNames.stream().filter(c ->
+    // c.equalsIgnoreCase(fieldName))
+    // .collect(Collectors.toList());
+    // if (ignoreCaseMatch.size() > 1) {
+    // throw new JdbcConnectorException(
+    // "The SQL table has at least two columns that match the PDX field: " + 
fieldName);
+    // }
+    //
+    // if (ignoreCaseMatch.size() == 1) {
+    // return ignoreCaseMatch.get(0);
+    // }
+    //
+    // // there is no match either in the configured mapping or the table 
columns
+    // return fieldName;
   }
 
-  /**
-   * Given a column name, search the given pdxTypes for a field whose name 
exactly matches the
-   * column name.
-   *
-   * @return the matching field name or null if no match
-   */
-  private String findExactMatch(String columnName, Set<PdxType> pdxTypes) {
-    for (PdxType pdxType : pdxTypes) {
-      if (pdxType.getPdxField(columnName) != null) {
-        return columnName;
-      }
+  public String getFieldNameForColumn(String columnName) {
+    FieldMapping fieldMapping = getFieldMappingByJdbcName(columnName);
+    if (fieldMapping != null) {
+      return fieldMapping.getPdxName();
     }
-    return null;
+    throw new JdbcConnectorException(
+        "A field mapping for the column \"" + columnName + "\" does not 
exist.");
+    // TODO use the following code when we create the mapping
+    // Set<PdxType> pdxTypes = getPdxTypesForClassName(typeRegistry);
+    // String fieldName = findExactMatch(columnName, pdxTypes);
+    // if (fieldName == null) {
+    // fieldName = findCaseInsensitiveMatch(columnName, pdxTypes);
+    // }
+    // return fieldName;
   }
 
+  // private Set<PdxType> getPdxTypesForClassName(TypeRegistry typeRegistry) {
+  // Set<PdxType> pdxTypes = 
typeRegistry.getPdxTypesForClassName(getPdxName());
+  // if (pdxTypes.isEmpty()) {
+  // throw new JdbcConnectorException(
+  // "The class " + getPdxName() + " has not been pdx serialized.");
+  // }
+  // return pdxTypes;
+  // }
+
+  // /**
+  // * Given a column name and a set of pdx types, find the field name in 
those types that match,
+  // * ignoring case, the column name.
+  // *
+  // * @return the matching field name or null if no match
+  // * @throws JdbcConnectorException if no fields match
+  // * @throws JdbcConnectorException if more than one field matches
+  // */
+  // private String findCaseInsensitiveMatch(String columnName, Set<PdxType> 
pdxTypes) {
+  // HashSet<String> matchingFieldNames = new HashSet<>();
+  // for (PdxType pdxType : pdxTypes) {
+  // for (String existingFieldName : pdxType.getFieldNames()) {
+  // if (existingFieldName.equalsIgnoreCase(columnName)) {
+  // matchingFieldNames.add(existingFieldName);
+  // }
+  // }
+  // }
+  // if (matchingFieldNames.isEmpty()) {
+  // throw new JdbcConnectorException("The class " + getPdxName()
+  // + " does not have a field that matches the column " + columnName);
+  // } else if (matchingFieldNames.size() > 1) {
+  // throw new JdbcConnectorException(
+  // "Could not determine what pdx field to use for the column name " + 
columnName
+  // + " because the pdx fields " + matchingFieldNames + " all match it.");
+  // }
+  // return matchingFieldNames.iterator().next();
+  // }
+  //
+  // /**
+  // * Given a column name, search the given pdxTypes for a field whose name 
exactly matches the
+  // * column name.
+  // *
+  // * @return the matching field name or null if no match
+  // */
+  // private String findExactMatch(String columnName, Set<PdxType> pdxTypes) {
+  // for (PdxType pdxType : pdxTypes) {
+  // if (pdxType.getPdxField(columnName) != null) {
+  // return columnName;
+  // }
+  // }
+  // return null;
+  // }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
@@ -251,11 +298,12 @@ public class RegionMapping implements CacheElement {
         && isEqual(dataSourceName, that.dataSourceName)
         && isEqual(ids, that.ids)
         && isEqual(catalog, that.catalog)
-        && isEqual(schema, that.schema);
+        && isEqual(schema, that.schema)
+        && isEqual(fieldMappings, that.fieldMappings);
   }
 
-  private static boolean isEqual(String s1, String s2) {
-    return s1 != null ? s1.equals(s2) : s2 == null;
+  private static boolean isEqual(Object o1, Object o2) {
+    return o1 != null ? o1.equals(o2) : o2 == null;
   }
 
   @Override
@@ -280,6 +328,7 @@ public class RegionMapping implements CacheElement {
         + ", ids='" + ids + '\''
         + ", catalog='" + catalog + '\''
         + ", schema='" + schema + '\''
+        + ", fieldMapping='" + fieldMappings + '\''
         + '}';
   }
 
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
index c4316ca..2f16ba1 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/ElementType.java
@@ -19,6 +19,7 @@ import java.util.Stack;
 import org.xml.sax.Attributes;
 
 import org.apache.geode.cache.CacheXmlException;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
 import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
 import org.apache.geode.internal.cache.xmlcache.RegionCreation;
 
@@ -49,6 +50,26 @@ public enum ElementType {
       RegionCreation regionCreation = (RegionCreation) stack.peek();
       regionCreation.getExtensionPoint().addExtension(new 
RegionMappingConfiguration(mapping));
     }
+  },
+
+  FIELD_MAPPING("field-mapping") {
+    @Override
+    void startElement(Stack<Object> stack, Attributes attributes) {
+      if (!(stack.peek() instanceof RegionMapping)) {
+        throw new CacheXmlException(
+            "<jdbc:field-mapping> elements must occur within <jdbc:mapping> 
elements");
+      }
+      RegionMapping mapping = (RegionMapping) stack.peek();
+      String pdxName = 
attributes.getValue(JdbcConnectorServiceXmlParser.PDX_NAME);
+      String pdxType = 
attributes.getValue(JdbcConnectorServiceXmlParser.PDX_TYPE);
+      String jdbcName = 
attributes.getValue(JdbcConnectorServiceXmlParser.JDBC_NAME);
+      String jdbcType = 
attributes.getValue(JdbcConnectorServiceXmlParser.JDBC_TYPE);
+      FieldMapping fieldMapping = new FieldMapping(pdxName, pdxType, jdbcName, 
jdbcType);
+      mapping.addFieldMapping(fieldMapping);
+    }
+
+    @Override
+    void endElement(Stack<Object> stack) {}
   };
 
   private String typeName;
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
index 900c012..b4feb98 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/xml/JdbcConnectorServiceXmlParser.java
@@ -23,10 +23,13 @@ public class JdbcConnectorServiceXmlParser extends 
AbstractXmlParser {
   public static final String NAMESPACE = "http://geode.apache.org/schema/jdbc";;
   static final String DATA_SOURCE = "data-source";
   static final String TABLE = "table";
-  static final String PDX_NAME = "pdx-name";
   static final String IDS = "ids";
   static final String CATALOG = "catalog";
   static final String SCHEMA = "schema";
+  static final String PDX_NAME = "pdx-name";
+  static final String PDX_TYPE = "pdx-type";
+  static final String JDBC_NAME = "jdbc-name";
+  static final String JDBC_TYPE = "jdbc-type";
 
   @Override
   public String getNamespaceUri() {
diff --git 
a/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
 
b/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
index 366fb81..7cdfbfe 100644
--- 
a/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
+++ 
b/geode-connectors/src/main/resources/META-INF/schemas/geode.apache.org/schema/jdbc/jdbc-1.0.xsd
@@ -40,6 +40,20 @@ XML schema for JDBC Connector Service in Geode.
     </xsd:annotation>
         <xsd:element name="mapping">
             <xsd:complexType>
+                <xsd:sequence> 
+                    <xsd:element name="field-mapping" maxOccurs="unbounded" 
minOccurs="0">     
+                        <xsd:complexType>      
+                            <xsd:simpleContent>        
+                                <xsd:extension base="xsd:string">      
+                                    <xsd:attribute type="xsd:string" 
name="pdx-name" use="required"/>
+                                    <xsd:attribute type="xsd:string" 
name="pdx-type" use="required"/>
+                                    <xsd:attribute type="xsd:string" 
name="jdbc-name" use="required"/>
+                                    <xsd:attribute type="xsd:string" 
name="jdbc-type" use="required"/>
+                                </xsd:extension>       
+                            </xsd:simpleContent>       
+                        </xsd:complexType>     
+                    </xsd:element>     
+                </xsd:sequence>
                 <xsd:attribute type="xsd:string" name="data-source" 
use="required"/>
                 <xsd:attribute type="xsd:string" name="table" use="optional"/>
                 <xsd:attribute type="xsd:string" name="pdx-name" 
use="required"/>
diff --git 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
index cd29c4b..f9954a7 100644
--- 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
+++ 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/RegionMappingTest.java
@@ -15,12 +15,6 @@
 package org.apache.geode.connectors.jdbc.internal;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -28,10 +22,8 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
 import org.apache.geode.connectors.jdbc.JdbcConnectorException;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
 import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
-import org.apache.geode.pdx.internal.PdxField;
-import org.apache.geode.pdx.internal.PdxType;
-import org.apache.geode.pdx.internal.TypeRegistry;
 
 public class RegionMappingTest {
 
@@ -60,8 +52,6 @@ public class RegionMappingTest {
     assertThat(mapping.getIds()).isNull();
     assertThat(mapping.getCatalog()).isNull();
     assertThat(mapping.getSchema()).isNull();
-    assertThat(mapping.getColumnNameForField("fieldName", 
mock(TableMetaDataView.class)))
-        .isEqualTo("fieldName");
   }
 
   @Test
@@ -117,133 +107,43 @@ public class RegionMappingTest {
   }
 
   @Test
-  public void returnsColumnNameIfFieldNotMapped() {
-    mapping = new RegionMapping(null, "pdxClassName", null, null, null, null, 
null);
-
-    String columnName = mapping.getColumnNameForField(fieldName1, 
mock(TableMetaDataView.class));
-
-    assertThat(columnName).isEqualTo(fieldName1);
-  }
-
-  @Test
-  public void 
returnsColumnNameFromTableMetaDataIfFieldNotMappedAndMetaDataMatchesWithCaseDiffering()
 {
-    String metaDataColumnName = fieldName1.toUpperCase();
+  public void getColumnNameForFieldThrowsIfFieldNotMapped() {
     mapping = new RegionMapping(null, "pdxClassName", null, null, null, null, 
null);
-    TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
-    
when(tableMetaDataView.getColumnNames()).thenReturn(Collections.singleton(metaDataColumnName));
-
-    assertThat(mapping.getColumnNameForField(fieldName1, tableMetaDataView))
-        .isEqualTo(metaDataColumnName);
-  }
-
-  @Test
-  public void 
returnsColumnNameFromTableMetaDataIfFieldNotMappedAndMetaDataMatchesExactly() {
-    String metaDataColumnName = fieldName1;
-    mapping = new RegionMapping(null, "pdxClassName", null, null, null, null, 
null);
-    TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
-    
when(tableMetaDataView.getColumnNames()).thenReturn(Collections.singleton(metaDataColumnName));
-
-    assertThat(mapping.getColumnNameForField(fieldName1, tableMetaDataView))
-        .isEqualTo(metaDataColumnName);
-  }
-
-  @Test
-  public void returnsColumnNameIfFieldNotMappedAndNotInMetaData() {
-    mapping = new RegionMapping(null, "pdxClassName", null, null, null, null, 
null);
-    TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
-    
when(tableMetaDataView.getColumnNames()).thenReturn(Collections.singleton("does 
not match"));
-
-    assertThat(mapping.getColumnNameForField(fieldName1, 
tableMetaDataView)).isEqualTo(fieldName1);
-  }
-
-  @Test
-  public void getColumnNameForFieldThrowsIfTwoColumnsMatchField() {
-    mapping = new RegionMapping(null, "pdxClassName", null, null, null, null, 
null);
-
-    TableMetaDataView tableMetaDataView = mock(TableMetaDataView.class);
-    HashSet<String> columnNames =
-        new HashSet<>(Arrays.asList(fieldName1.toUpperCase(), 
fieldName1.toLowerCase()));
-    when(tableMetaDataView.getColumnNames()).thenReturn(columnNames);
-
     expectedException.expect(JdbcConnectorException.class);
     expectedException
-        .expectMessage("The SQL table has at least two columns that match the 
PDX field: myField1");
-    mapping.getColumnNameForField(fieldName1, tableMetaDataView);
+        .expectMessage("A field mapping for the pdx field \"" + fieldName1 + 
"\" does not exist.");
 
+    mapping.getColumnNameForField(fieldName1);
   }
 
   @Test
-  public void throwsIfColumnNotMappedAndPdxClassNameDoesNotExist() {
+  public void getFieldNameForColumnThrowsIfColumnNotMapped() {
     mapping = new RegionMapping(null, "pdxClassName", null, null, null, null, 
null);
-    TypeRegistry typeRegistry = mock(TypeRegistry.class);
-    
when(typeRegistry.getPdxTypesForClassName("pdxClassName")).thenReturn(Collections.emptySet());
-    expectedException.expect(JdbcConnectorException.class);
-    expectedException.expectMessage("The class pdxClassName has not been pdx 
serialized.");
-
-    mapping.getFieldNameForColumn("columnName", typeRegistry);
-  }
-
-  @Test
-  public void 
throwsIfColumnNotMappedAndPdxClassNameDoesExistButHasNoMatchingFields() {
-    String pdxClassName = "pdxClassName";
-    String columnName = "columnName";
-    mapping = new RegionMapping(null, pdxClassName, null, null, null, null, 
null);
-    TypeRegistry typeRegistry = mock(TypeRegistry.class);
-    HashSet<PdxType> pdxTypes = new 
HashSet<>(Arrays.asList(mock(PdxType.class)));
-    
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
     expectedException.expect(JdbcConnectorException.class);
-    expectedException.expectMessage("The class " + pdxClassName
-        + " does not have a field that matches the column " + columnName);
+    expectedException
+        .expectMessage("A field mapping for the column \"columnName\" does not 
exist.");
 
-    mapping.getFieldNameForColumn(columnName, typeRegistry);
+    mapping.getFieldNameForColumn("columnName");
   }
 
   @Test
-  public void 
throwsIfColumnNotMappedAndPdxClassNameDoesExistButHasMoreThanOneMatchingFields()
 {
+  public void getFieldNameForColumnReturnsFieldNameIfMapped() {
     String pdxClassName = "pdxClassName";
     String columnName = "columnName";
     mapping = new RegionMapping(null, pdxClassName, null, null, null, null, 
null);
-    TypeRegistry typeRegistry = mock(TypeRegistry.class);
-    PdxType pdxType = mock(PdxType.class);
-    when(pdxType.getFieldNames())
-        .thenReturn(Arrays.asList(columnName.toLowerCase(), 
columnName.toUpperCase()));
-    HashSet<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-    
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
-    expectedException.expect(JdbcConnectorException.class);
-    expectedException.expectMessage(
-        "Could not determine what pdx field to use for the column name " + 
columnName);
+    mapping.addFieldMapping(new FieldMapping(pdxClassName, null, columnName, 
null));
 
-    mapping.getFieldNameForColumn(columnName, typeRegistry);
+    
assertThat(mapping.getFieldNameForColumn(columnName)).isEqualTo(pdxClassName);
   }
 
   @Test
-  public void 
returnsIfColumnNotMappedAndPdxClassNameDoesExistAndHasOneFieldThatInexactlyMatches()
 {
+  public void getColumnNameForFieldReturnsColumnNameIfMapped() {
     String pdxClassName = "pdxClassName";
     String columnName = "columnName";
     mapping = new RegionMapping(null, pdxClassName, null, null, null, null, 
null);
-    TypeRegistry typeRegistry = mock(TypeRegistry.class);
-    PdxType pdxType = mock(PdxType.class);
-    when(pdxType.getFieldNames())
-        .thenReturn(Arrays.asList("someOtherField", columnName.toUpperCase()));
-    HashSet<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-    
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
-
-    assertThat(mapping.getFieldNameForColumn(columnName, typeRegistry))
-        .isEqualTo(columnName.toUpperCase());
-  }
+    mapping.addFieldMapping(new FieldMapping(pdxClassName, null, columnName, 
null));
 
-  @Test
-  public void 
returnsIfColumnNotMappedAndPdxClassNameDoesExistAndHasOneFieldThatExactlyMatches()
 {
-    String pdxClassName = "pdxClassName";
-    String columnName = "columnName";
-    mapping = new RegionMapping(null, pdxClassName, null, null, null, null, 
null);
-    TypeRegistry typeRegistry = mock(TypeRegistry.class);
-    PdxType pdxType = mock(PdxType.class);
-    when(pdxType.getPdxField(columnName)).thenReturn(mock(PdxField.class));
-    HashSet<PdxType> pdxTypes = new HashSet<>(Arrays.asList(pdxType));
-    
when(typeRegistry.getPdxTypesForClassName(pdxClassName)).thenReturn(pdxTypes);
-
-    assertThat(mapping.getFieldNameForColumn(columnName, 
typeRegistry)).isEqualTo(columnName);
+    
assertThat(mapping.getColumnNameForField(pdxClassName)).isEqualTo(columnName);
   }
 
   @Test
@@ -255,7 +155,6 @@ public class RegionMappingTest {
     assertThat(rm1).isEqualTo(rm2);
   }
 
-
   @Test
   public void verifyTwoInstancesThatAreEqualHaveSameHashCode() {
     RegionMapping rm1 = new RegionMapping("regionName",
@@ -271,11 +170,12 @@ public class RegionMappingTest {
   public void verifyToStringGivenAllAttributes() {
     RegionMapping rm = new RegionMapping("regionName", "pdxClassName", 
"tableName",
         "dataSourceName", "ids", "catalog", "schema");
+    rm.addFieldMapping(new FieldMapping("pdxName", "pdxType", "jdbcName", 
"jdbcType"));
 
     String result = rm.toString();
 
     assertThat(result).isEqualTo(
-        "RegionMapping{regionName='regionName', pdxName='pdxClassName', 
tableName='tableName', dataSourceName='dataSourceName', ids='ids', 
catalog='catalog', schema='schema'}");
+        "RegionMapping{regionName='regionName', pdxName='pdxClassName', 
tableName='tableName', dataSourceName='dataSourceName', ids='ids', 
catalog='catalog', schema='schema', fieldMapping='[FieldMapping 
[pdxName=pdxName, pdxType=pdxType, jdbcName=jdbcName, jdbcType=jdbcType]]'}");
   }
 
   @Test
@@ -286,7 +186,7 @@ public class RegionMappingTest {
     String result = rm.toString();
 
     assertThat(result).isEqualTo(
-        "RegionMapping{regionName='regionName', pdxName='pdxClassName', 
tableName='null', dataSourceName='dataSourceName', ids='null', catalog='null', 
schema='null'}");
+        "RegionMapping{regionName='regionName', pdxName='pdxClassName', 
tableName='null', dataSourceName='dataSourceName', ids='null', catalog='null', 
schema='null', fieldMapping='[]'}");
   }
 
   @Test
@@ -381,4 +281,17 @@ public class RegionMappingTest {
     assertThat(result).isFalse();
   }
 
+  @Test
+  public void verifyMappingWithDifferentFieldMappingsAreNotEqual() {
+    RegionMapping rm1 =
+        new RegionMapping(null, "pdxClassName", null, null, null, null, null);
+    rm1.addFieldMapping(new FieldMapping("myPdxName", "myPdxType", 
"myJdbcName", "myJdbcType"));
+    RegionMapping rm2 =
+        new RegionMapping(null, "pdxClassName", null, null, null, null, null);
+    rm2.addFieldMapping(
+        new FieldMapping("myPdxName", "myPdxType", "myJdbcName", 
"myOtherJdbcType"));
+    boolean result = rm1.equals(rm2);
+    assertThat(result).isFalse();
+  }
+
 }
diff --git 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
index ab6e282..53c1476 100644
--- 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
+++ 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
@@ -175,7 +175,7 @@ public class SqlHandlerTest {
   public void writeWithCharField() throws Exception {
     String fieldName = "fieldName";
     Object fieldValue = 'S';
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -193,7 +193,7 @@ public class SqlHandlerTest {
     String fieldName = "fieldName";
     Object fieldValue = new Date();
     
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(JDBCType.NULL);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -213,7 +213,7 @@ public class SqlHandlerTest {
     Object expectedValueWritten = new java.sql.Date(fieldValue.getTime());
     JDBCType dataType = JDBCType.DATE;
     when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -233,7 +233,7 @@ public class SqlHandlerTest {
     Object expectedValueWritten = new java.sql.Time(fieldValue.getTime());
     JDBCType dataType = JDBCType.TIME;
     when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -253,7 +253,7 @@ public class SqlHandlerTest {
     Object expectedValueWritten = new java.sql.Time(fieldValue.getTime());
     JDBCType dataType = JDBCType.TIME_WITH_TIMEZONE;
     when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -273,7 +273,7 @@ public class SqlHandlerTest {
     Object expectedValueWritten = new java.sql.Timestamp(fieldValue.getTime());
     JDBCType dataType = JDBCType.TIMESTAMP;
     when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -293,7 +293,7 @@ public class SqlHandlerTest {
     Object expectedValueWritten = new java.sql.Timestamp(fieldValue.getTime());
     JDBCType dataType = JDBCType.TIMESTAMP_WITH_TIMEZONE;
     when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -310,7 +310,7 @@ public class SqlHandlerTest {
   public void writeWithNonCharField() throws Exception {
     String fieldName = "fieldName";
     int fieldValue = 100;
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -328,7 +328,7 @@ public class SqlHandlerTest {
     String fieldName = "fieldName";
     Object fieldValue = null;
     
when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(JDBCType.NULL);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -347,7 +347,7 @@ public class SqlHandlerTest {
     Object fieldValue = null;
     JDBCType dataType = JDBCType.VARCHAR;
     when(tableMetaDataView.getColumnDataType(fieldName)).thenReturn(dataType);
-    when(regionMapping.getColumnNameForField(eq(fieldName), 
any())).thenReturn(fieldName);
+    
when(regionMapping.getColumnNameForField(eq(fieldName))).thenReturn(fieldName);
     when(value.getFieldNames()).thenReturn(Arrays.asList(fieldName));
     when(value.getField(fieldName)).thenReturn(fieldValue);
 
@@ -381,8 +381,8 @@ public class SqlHandlerTest {
     
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
     
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
 
     handler.write(region, Operation.CREATE, compositeKey, value);
 
@@ -414,8 +414,8 @@ public class SqlHandlerTest {
     
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
     
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
 
     handler.write(region, Operation.UPDATE, compositeKey, value);
 
@@ -447,8 +447,8 @@ public class SqlHandlerTest {
     when(destroyKey.getField("fieldOne")).thenReturn(destroyKeyFieldValueOne);
     when(destroyKey.getField("fieldTwo")).thenReturn(destroyKeyFieldValueTwo);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
 
     handler.write(region, Operation.DESTROY, destroyKey, value);
 
@@ -596,8 +596,8 @@ public class SqlHandlerTest {
     
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
     
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
 
     EntryColumnData entryColumnData =
         handler.getEntryColumnData(tableMetaDataView, regionMapping, 
compositeKey, value,
@@ -618,8 +618,8 @@ public class SqlHandlerTest {
     when(compositeKey.isDeserializable()).thenReturn(false);
     when(compositeKey.getFieldNames()).thenReturn(Arrays.asList("fieldOne"));
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage(
         "The key \"" + compositeKey + "\" should have 2 fields but has 1 
fields.");
@@ -638,8 +638,8 @@ public class SqlHandlerTest {
     
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
     
when(compositeKey.getField("fieldTwoWrong")).thenReturn(compositeKeyFieldValueTwo);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("The key \"" + compositeKey
         + "\" has the field \"fieldTwoWrong\" which does not match any of the 
key columns: [fieldOne, fieldTwo]");
@@ -660,8 +660,8 @@ public class SqlHandlerTest {
 
   private void testGetEntryColumnDataForCreateOrUpdate(Operation operation) {
     String nonKeyColumn = "otherColumn";
-    when(regionMapping.getColumnNameForField(eq(KEY_COLUMN), 
any())).thenReturn(KEY_COLUMN);
-    when(regionMapping.getColumnNameForField(eq(nonKeyColumn), 
any())).thenReturn(nonKeyColumn);
+    
when(regionMapping.getColumnNameForField(eq(KEY_COLUMN))).thenReturn(KEY_COLUMN);
+    
when(regionMapping.getColumnNameForField(eq(nonKeyColumn))).thenReturn(nonKeyColumn);
     when(value.getFieldNames()).thenReturn(Arrays.asList(KEY_COLUMN, 
nonKeyColumn));
 
     EntryColumnData entryColumnData =
@@ -695,10 +695,10 @@ public class SqlHandlerTest {
     
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
     
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
     String nonKeyColumn = "otherColumn";
-    when(regionMapping.getColumnNameForField(eq(nonKeyColumn), 
any())).thenReturn(nonKeyColumn);
+    
when(regionMapping.getColumnNameForField(eq(nonKeyColumn))).thenReturn(nonKeyColumn);
     when(value.getFieldNames()).thenReturn(Arrays.asList("fieldOne", 
"fieldTwo", nonKeyColumn));
 
     EntryColumnData entryColumnData =
@@ -726,8 +726,8 @@ public class SqlHandlerTest {
     
when(compositeKey.getField("fieldOne")).thenReturn(compositeKeyFieldValueOne);
     
when(compositeKey.getField("fieldTwo")).thenReturn(compositeKeyFieldValueTwo);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList("fieldOne",
 "fieldTwo"));
-    when(regionMapping.getColumnNameForField("fieldOne", 
tableMetaDataView)).thenReturn("fieldOne");
-    when(regionMapping.getColumnNameForField("fieldTwo", 
tableMetaDataView)).thenReturn("fieldTwo");
+    
when(regionMapping.getColumnNameForField("fieldOne")).thenReturn("fieldOne");
+    
when(regionMapping.getColumnNameForField("fieldTwo")).thenReturn("fieldTwo");
 
     EntryColumnData entryColumnData =
         handler.getEntryColumnData(tableMetaDataView, regionMapping, 
compositeKey, value,
diff --git 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
index 8178db3..97fc4d0 100644
--- 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
+++ 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlToPdxInstanceCreatorTest.java
@@ -105,9 +105,9 @@ public class SqlToPdxInstanceCreatorTest {
     setupResultSetForTwoObjectColumns(resultSet);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
         .thenReturn(PDX_FIELD_NAME_2);
     tableMetaDataView = mock(TableMetaDataView.class);
     
when(tableMetaDataView.getKeyColumnNames()).thenReturn(Arrays.asList(COLUMN_NAME_1));
@@ -139,9 +139,9 @@ public class SqlToPdxInstanceCreatorTest {
     String pdxClassName = "myPdxClassName";
     when(cache.createPdxInstanceFactory(pdxClassName)).thenReturn(factory);
     when(cache.createPdxInstanceFactory(anyString(), 
anyBoolean())).thenReturn(factory);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
         .thenReturn(PDX_FIELD_NAME_2);
     TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
     when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
@@ -167,7 +167,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = mock(PdxInstanceFactory.class);
     String fieldName1 = "pdxFieldName1";
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), 
any())).thenReturn(fieldName1);
+    
when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1))).thenReturn(fieldName1);
     TypeRegistry pdxTypeRegistry = mock(TypeRegistry.class);
     when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
     String pdxClassName = "myPdxClassName";
@@ -191,7 +191,7 @@ public class SqlToPdxInstanceCreatorTest {
     setupResultSet(resultSet, fieldType);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
     when(tableMetaDataView.getColumnDataType(any())).thenReturn(JDBCType.NULL);
 
@@ -213,7 +213,7 @@ public class SqlToPdxInstanceCreatorTest {
     setupResultSet(resultSet, fieldType, null);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
     when(tableMetaDataView.getColumnDataType(any())).thenReturn(JDBCType.NULL);
 
@@ -234,7 +234,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getString(1)).thenReturn("");
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -256,7 +256,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getDate(1)).thenReturn(sqlDate);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -280,7 +280,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -302,7 +302,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -324,7 +324,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Blob of length 2147483648 is too big to be converted 
to a byte array.");
@@ -347,7 +347,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getBlob(1)).thenReturn(blob);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -369,7 +369,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getTime(1)).thenReturn(sqlTime);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -391,7 +391,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getTimestamp(1)).thenReturn(sqlTimestamp);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -412,7 +412,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(sqlDate);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -432,7 +432,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(expectedValue);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -453,7 +453,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(sqlTime);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -474,7 +474,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(resultSet.getObject(1)).thenReturn(sqlTimestamp);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
     PdxInstanceFactory factory = setupPdxInstanceFactory(fieldType);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
 
     createPdxInstance();
@@ -491,9 +491,9 @@ public class SqlToPdxInstanceCreatorTest {
     setupPdxInstanceFactory(fieldType);
     setupResultSetForObject(resultSet, returnValue);
     when(resultSet.next()).thenReturn(true).thenReturn(false);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_2)))
         .thenReturn(PDX_FIELD_NAME_2);
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Could not convert ");
@@ -517,7 +517,7 @@ public class SqlToPdxInstanceCreatorTest {
     PdxField pdxField = mock(PdxField.class);
     when(pdxField.getFieldType()).thenReturn(FieldType.OBJECT);
     when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(pdxField);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Multiple rows returned for query: ");
@@ -538,7 +538,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(regionMapping.getPdxName()).thenReturn(pdxClassName);
     when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(pdxType);
     when(pdxType.getPdxField(PDX_FIELD_NAME_1)).thenReturn(null);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Could not find PdxType");
@@ -557,7 +557,7 @@ public class SqlToPdxInstanceCreatorTest {
     when(cache.getPdxRegistry()).thenReturn(pdxTypeRegistry);
     when(regionMapping.getPdxName()).thenReturn(pdxClassName);
     when(pdxTypeRegistry.getPdxTypeForField(PDX_FIELD_NAME_1, 
pdxClassName)).thenReturn(null);
-    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1), any()))
+    when(regionMapping.getFieldNameForColumn(eq(COLUMN_NAME_1)))
         .thenReturn(PDX_FIELD_NAME_1);
     thrown.expect(JdbcConnectorException.class);
     thrown.expectMessage("Could not find PdxType");
diff --git 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
index a7c8bf0..9928940 100644
--- 
a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
+++ 
b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/xml/ElementTypeTest.java
@@ -14,17 +14,21 @@
  */
 package org.apache.geode.connectors.jdbc.internal.xml;
 
-
+import static 
org.apache.geode.connectors.jdbc.internal.xml.ElementType.FIELD_MAPPING;
 import static 
org.apache.geode.connectors.jdbc.internal.xml.ElementType.JDBC_MAPPING;
 import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.CATALOG;
 import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.DATA_SOURCE;
 import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.IDS;
+import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.JDBC_NAME;
+import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.JDBC_TYPE;
 import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.PDX_NAME;
+import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.PDX_TYPE;
 import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.SCHEMA;
 import static 
org.apache.geode.connectors.jdbc.internal.xml.JdbcConnectorServiceXmlParser.TABLE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import java.util.Stack;
@@ -35,6 +39,7 @@ import org.xml.sax.Attributes;
 
 import org.apache.geode.cache.CacheXmlException;
 import org.apache.geode.cache.Region;
+import org.apache.geode.connectors.jdbc.internal.configuration.FieldMapping;
 import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
 import org.apache.geode.internal.cache.extension.ExtensionPoint;
 import org.apache.geode.internal.cache.xmlcache.RegionCreation;
@@ -104,4 +109,43 @@ public class ElementTypeTest {
 
     assertThat(stack.size()).isEqualTo(1);
   }
+
+  @Test
+  public void startElementFieldMappingThrowsWithoutRegionMapping() {
+    stack.push(new Object());
+
+    assertThatThrownBy(() -> FIELD_MAPPING.startElement(stack, attributes))
+        .isInstanceOf(CacheXmlException.class)
+        .hasMessage("<jdbc:field-mapping> elements must occur within 
<jdbc:mapping> elements");
+  }
+
+  @Test
+  public void startElementFieldMapping() {
+    RegionMapping mapping = new RegionMapping();
+    stack.push(mapping);
+    when(attributes.getValue(PDX_NAME)).thenReturn("myPdxName");
+    when(attributes.getValue(PDX_TYPE)).thenReturn("myPdxType");
+    when(attributes.getValue(JDBC_NAME)).thenReturn("myJdbcName");
+    when(attributes.getValue(JDBC_TYPE)).thenReturn("myJdbcType");
+    FieldMapping expected = new FieldMapping("myPdxName", "myPdxType", 
"myJdbcName", "myJdbcType");
+
+    ElementType.FIELD_MAPPING.startElement(stack, attributes);
+
+    RegionMapping mapping1 = (RegionMapping) stack.pop();
+    
assertThat(mapping1.getColumnNameForField("myPdxName")).isEqualTo("myJdbcName");
+    
assertThat(mapping1.getFieldNameForColumn("myJdbcName")).isEqualTo("myPdxName");
+    
assertThat(mapping1.getFieldMappingByJdbcName("myJdbcName")).isEqualTo(expected);
+    
assertThat(mapping1.getFieldMappingByPdxName("myPdxName")).isEqualTo(expected);
+  }
+
+  @Test
+  public void endElementFieldMapping() {
+    RegionMapping mapping = mock(RegionMapping.class);
+    stack.push(mapping);
+
+    ElementType.FIELD_MAPPING.endElement(stack);
+
+    assertThat(stack.size()).isEqualTo(1);
+    verifyZeroInteractions(mapping);
+  }
 }

Reply via email to