[OLINGO-1148]Cannot set Nullable property to null value on entity Update in JPA
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
index 70e1285..d3fd2da 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
@@ -26,6 +26,7 @@
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -215,10 +216,11 @@
   }
 
   protected void setProperty(final Method method, final Object entity, final Object entityPropertyValue,
-      final EdmSimpleType type) throws
-      IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException {
+      final EdmSimpleType type, boolean isNullable) throws
+      IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException, 
+      EdmException {
 
-    setProperty(method, entity, entityPropertyValue, type, null);
+    setProperty(method, entity, entityPropertyValue, type, null, isNullable);
   }
 
   protected void setEmbeddableKeyProperty(final HashMap<String, String> embeddableKeys,
@@ -360,12 +362,15 @@
             }
           }
           accessModifier = accessModifiersWrite.get(propertyName);
+          EdmProperty edmProperty = (EdmProperty)oDataEntityType.getProperty(propertyName);
+          boolean isNullable = edmProperty.getFacets() == null ? (keyNames.contains(propertyName)? false : true)
+              : edmProperty.getFacets().isNullable() == null ? true : edmProperty.getFacets().isNullable();
           if (isVirtual) {
             setProperty(accessModifier, jpaEntity, oDataEntryProperties.get(propertyName), (EdmSimpleType) edmTyped
-                .getType(), propertyName);
+                .getType(), isNullable);
           } else {
             setProperty(accessModifier, jpaEntity, oDataEntryProperties.get(propertyName), (EdmSimpleType) edmTyped
-                .getType());
+                .getType(), isNullable);
           }
           break;
         case COMPLEX:
@@ -453,12 +458,15 @@
               (HashMap<String, Object>) propertyValue.get(edmPropertyName), propertyName);
         } else {
           EdmSimpleType simpleType = (EdmSimpleType) type;
+          EdmProperty edmProperty = (EdmProperty)edmComplexType.getProperty(edmPropertyName);
+          boolean isNullable = edmProperty.getFacets() == null ? true
+              : edmProperty.getFacets().isNullable() == null ? true : edmProperty.getFacets().isNullable();
     		  if (propertyName != null) {
             setProperty(accessModifier, embeddableObject, propertyValue.get(edmPropertyName),
-                simpleType, edmPropertyName);
+                simpleType, isNullable);
           } else {
             setProperty(accessModifier, embeddableObject, propertyValue.get(edmPropertyName),
-                simpleType);
+                simpleType, isNullable);
           }
         }
       }
@@ -467,9 +475,10 @@
 
   @SuppressWarnings({ "unchecked", "rawtypes" })
   protected void setProperty(final Method method, final Object entity, final Object entityPropertyValue,
-      final EdmSimpleType type, String propertyName) throws
-      IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException {
-    if (entityPropertyValue != null) {
+      final EdmSimpleType type, String propertyName, boolean isNullable) throws
+      IllegalAccessException, IllegalArgumentException, InvocationTargetException, ODataJPARuntimeException, 
+      EdmException {
+    if (entityPropertyValue != null || isNullable) {
       if (propertyName != null) {
         method.invoke(entity, propertyName, entityPropertyValue);
         return;
@@ -479,19 +488,22 @@
         if (parameterType.equals(String.class)) {
           method.invoke(entity, entityPropertyValue);
         } else if (parameterType.equals(char[].class)) {
-          char[] characters = ((String) entityPropertyValue).toCharArray();
+          char[] characters = entityPropertyValue != null ? ((String) entityPropertyValue).toCharArray() : null;
           method.invoke(entity, characters);
         } else if (parameterType.equals(char.class)) {
-          char c = ((String) entityPropertyValue).charAt(0);
+          char c = entityPropertyValue != null ? ((String) entityPropertyValue).charAt(0) : '\u0000';
           method.invoke(entity, c);
         } else if (parameterType.equals(Character[].class)) {
-          Character[] characters = JPAEntityParser.toCharacterArray((String) entityPropertyValue);
+          Character[] characters = entityPropertyValue != null ? 
+              JPAEntityParser.toCharacterArray((String) entityPropertyValue) : null;
           method.invoke(entity, (Object) characters);
         } else if (parameterType.equals(Character.class)) {
-          Character c = Character.valueOf(((String) entityPropertyValue).charAt(0));
+          Character c = entityPropertyValue != null ? 
+              Character.valueOf(((String) entityPropertyValue).charAt(0)) : null;
           method.invoke(entity, c);
         } else if (parameterType.isEnum()) {
-          Enum e = Enum.valueOf((Class<Enum>) parameterType, (String) entityPropertyValue);
+          Enum e = entityPropertyValue != null ?
+              Enum.valueOf((Class<Enum>) parameterType, (String) entityPropertyValue) : null;
           method.invoke(entity, e);
         }
       } else if (parameterType.equals(Blob.class)) {
@@ -499,26 +511,32 @@
           throw ODataJPARuntimeException
               .throwException(ODataJPARuntimeException.ERROR_JPA_BLOB_NULL, null);
         } else {
-          method.invoke(entity, onJPAWriteContent.getJPABlob((byte[]) entityPropertyValue));
+          method.invoke(entity, entityPropertyValue != null ? 
+              onJPAWriteContent.getJPABlob((byte[]) entityPropertyValue) : null);
         }
       } else if (parameterType.equals(Clob.class)) {
         if (onJPAWriteContent == null) {
           throw ODataJPARuntimeException
               .throwException(ODataJPARuntimeException.ERROR_JPA_CLOB_NULL, null);
         } else {
-          method.invoke(entity, onJPAWriteContent.getJPAClob(((String) entityPropertyValue).toCharArray()));
+          method.invoke(entity, entityPropertyValue != null ? 
+              onJPAWriteContent.getJPAClob(((String) entityPropertyValue).toCharArray()) : null);
         }
       } else if (parameterType.equals(Timestamp.class)) {
-        Timestamp ts = new Timestamp(((Calendar) entityPropertyValue).getTimeInMillis());
+        Timestamp ts = entityPropertyValue != null ? 
+            new Timestamp(((Calendar) entityPropertyValue).getTimeInMillis()) : null;
         method.invoke(entity, ts);
       } else if (parameterType.equals(java.util.Date.class)) {
-        method.invoke(entity, ((Calendar) entityPropertyValue).getTime());
+        Date d = entityPropertyValue != null ? ((Calendar) entityPropertyValue).getTime(): null;
+        method.invoke(entity, d);
       } else if (parameterType.equals(java.sql.Date.class)) {
-        long timeInMs = ((Calendar) entityPropertyValue).getTimeInMillis();
-        method.invoke(entity, new java.sql.Date(timeInMs));
+        java.sql.Date d = entityPropertyValue != null ? 
+            new java.sql.Date(((Calendar) entityPropertyValue).getTimeInMillis()) : null;
+        method.invoke(entity, d);
       } else if (parameterType.equals(java.sql.Time.class)) {
-        long timeInMs = ((Calendar) entityPropertyValue).getTimeInMillis();
-        method.invoke(entity, new java.sql.Time(timeInMs));
+        java.sql.Time t = entityPropertyValue != null ? 
+            new java.sql.Time(((Calendar) entityPropertyValue).getTimeInMillis()) : null;
+        method.invoke(entity, t);
       } else {
         method.invoke(entity, entityPropertyValue);
       }
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
index e904564..befee61 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
@@ -42,6 +42,7 @@
 import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPATypeEmbeddableMock;
 import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPATypeEmbeddableMock2;
 import org.apache.olingo.odata2.jpa.processor.core.mock.data.ODataEntryMockUtil;
+import org.junit.Assert;
 import org.junit.Test;
 
 public class JPAEntityTest {
@@ -257,4 +258,107 @@
     ODataJPAContext jpaContext = ODataJPAContextMock.mockODataJPAContext(context);
     return jpaContext;
   }
+  
+  @Test
+  public void testUpdateODataEntryWithNullValue() {
+    try {
+      EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false);
+      EdmEntityType edmEntityType = edmEntitySet.getEntityType();
+
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, mockODataJPAContext());
+      JPATypeMock jpaTypeMock = new JPATypeMock();
+      jpaEntity.setJPAEntity(jpaTypeMock);
+      jpaEntity.update(ODataEntryMockUtil.mockODataEntryWithNullValue(JPATypeMock.ENTITY_NAME));
+    } catch (ODataJPARuntimeException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    } catch (EdmException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    } catch (ODataException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    }
+    JPATypeMock jpaTypeMock = (JPATypeMock) jpaEntity.getJPAEntity();
+    assertEquals(jpaTypeMock.getMInt(), 0);// Key should not be changed
+    assertEquals(jpaTypeMock.getMString(), null);
+    assertEquals(jpaTypeMock.getMDateTime(), null);
+    assertEquals(jpaTypeMock.getMBlob(), null);
+    assertEquals(jpaTypeMock.getMCArray(), null);
+    assertEquals(jpaTypeMock.getMChar(), null);
+    Assert.assertArrayEquals(jpaTypeMock.getMCharArray(), null);
+    assertEquals(jpaTypeMock.getMClob(), null);
+  }
+  
+  @Test
+  public void testCreateODataEntryWithComplexTypeWithNullValues() {
+    try {
+      EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, true);
+      EdmEntityType edmEntityType = edmEntitySet.getEntityType();
+
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, mockODataJPAContext());
+      jpaEntity.create(ODataEntryMockUtil.mockODataEntryWithComplexTypeWithNullValue(JPATypeMock.ENTITY_NAME));
+    } catch (ODataJPARuntimeException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    } catch (EdmException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    } catch (ODataException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    }
+    JPATypeMock jpaTypeMock = (JPATypeMock) jpaEntity.getJPAEntity();
+    assertEquals(jpaTypeMock.getMInt(), ODataEntryMockUtil.VALUE_MINT);
+    assertEquals(jpaTypeMock.getMString(), "Mock");
+    JPATypeEmbeddableMock jpaEmbeddableMock = jpaTypeMock.getComplexType();
+    assertNotNull(jpaEmbeddableMock);
+
+    assertEquals(jpaEmbeddableMock.getMShort(), null);
+    assertEquals(jpaEmbeddableMock.getMDate(), null);
+    assertEquals(jpaEmbeddableMock.getMDate1(), null);
+    assertEquals(jpaEmbeddableMock.getMTime(), null);
+    assertEquals(jpaEmbeddableMock.getMTimestamp(), null);
+    JPATypeEmbeddableMock2 jpaEmbeddableMock2 = jpaEmbeddableMock.getMEmbeddable();
+    assertNotNull(jpaEmbeddableMock2);
+    assertEquals(jpaEmbeddableMock2.getMFloat(), null);
+    assertEquals(jpaEmbeddableMock2.getMUUID(), null);
+  }
+  
+  @Test
+  public void testCreateODataEntryWithComplexTypeWithMoreProperties() {
+    try {
+      EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, true);
+      EdmEntityType edmEntityType = edmEntitySet.getEntityType();
+
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, mockODataJPAContext());
+      jpaEntity.create(ODataEntryMockUtil.mockODataEntryWithComplexType(JPATypeMock.ENTITY_NAME));
+    } catch (ODataJPARuntimeException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    } catch (EdmException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    } catch (ODataException e) {
+      fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
+          + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
+    }
+    JPATypeMock jpaTypeMock = (JPATypeMock) jpaEntity.getJPAEntity();
+    assertEquals(jpaTypeMock.getMInt(), ODataEntryMockUtil.VALUE_MINT);
+    assertEquals(jpaTypeMock.getMString(), ODataEntryMockUtil.VALUE_MSTRING);
+    assertTrue(jpaTypeMock.getMDateTime().equals(ODataEntryMockUtil.VALUE_DATE_TIME));
+    JPATypeEmbeddableMock jpaEmbeddableMock = jpaTypeMock.getComplexType();
+    assertNotNull(jpaEmbeddableMock);
+
+    assertEquals(jpaEmbeddableMock.getMShort(), ODataEntryMockUtil.VALUE_SHORT);
+    assertEquals(jpaEmbeddableMock.getMDate().getDate(), ODataEntryMockUtil.VALUE_DATE.getDate());
+    assertEquals(jpaEmbeddableMock.getMDate().getTime(), ODataEntryMockUtil.VALUE_DATE.getTime());
+    assertEquals(jpaEmbeddableMock.getMDate1(), ODataEntryMockUtil.VALUE_DATE1);
+    assertEquals(jpaEmbeddableMock.getMTime(), ODataEntryMockUtil.VALUE_TIME);
+    assertEquals(jpaEmbeddableMock.getMTimestamp(), ODataEntryMockUtil.VALUE_TIMESTAMP);
+    JPATypeEmbeddableMock2 jpaEmbeddableMock2 = jpaEmbeddableMock.getMEmbeddable();
+    assertNotNull(jpaEmbeddableMock2);
+    assertEquals(jpaEmbeddableMock2.getMFloat(), ODataEntryMockUtil.VALUE_MFLOAT, 1);
+    assertEquals(jpaEmbeddableMock2.getMUUID(), ODataEntryMockUtil.VALUE_UUID);
+  }
 }
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java
index a5e32db..dcf3ab9 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/EdmMockUtilV2.java
@@ -20,6 +20,8 @@
 
 import java.sql.Blob;
 import java.sql.Clob;
+import java.sql.Time;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.List;
@@ -108,6 +110,7 @@
       EasyMock.expect(entityType.getProperty(JPATypeMock.NAVIGATION_PROPERTY_X)).andReturn(
           mockEdmNavigationProperty(JPATypeMock.NAVIGATION_PROPERTY_X, EdmMultiplicity.ONE)).anyTimes();
       EasyMock.expect(entityType.getProperty(JPATypeMock.NAVIGATION_PROPERTY_XS)).andReturn(null).anyTimes();
+      
     } else if (entityName.equals(JPARelatedTypeMock.ENTITY_NAME)) {
       EasyMock.expect(entityType.getProperty(JPARelatedTypeMock.PROPERTY_NAME_MLONG)).andReturn(
           mockEdmProperty(entityName, JPARelatedTypeMock.PROPERTY_NAME_MLONG)).anyTimes();
@@ -171,6 +174,10 @@
       propertyNames.add(JPARelatedTypeMock.PROPERTY_NAME_MDOUBLE);
     } else if (entityName.equals(JPATypeEmbeddableMock.ENTITY_NAME)) {
       propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT);
+      propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE);
+      propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1);
+      propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME);
+      propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP);
       propertyNames.add(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE);
     } else if (entityName.equals(JPATypeEmbeddableMock2.ENTITY_NAME)) {
       propertyNames.add(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT);
@@ -268,10 +275,15 @@
         propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MLONG) ||
         propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MBYTE) ||
         propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MDOUBLE) ||
-        propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY)) {
+        propertyName.equals(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY) ||
+        propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE) ||
+        propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1) ||
+        propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME) ||
+        propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)) {
 
       EdmSimpleType edmType = EasyMock.createMock(EdmSimpleType.class);
       EasyMock.expect(edmProperty.getType()).andReturn(edmType).anyTimes();
+      EasyMock.expect(edmProperty.getFacets()).andReturn(null).anyTimes();
       EasyMock.expect(edmType.getKind()).andReturn(EdmTypeKind.SIMPLE).anyTimes();
       if (propertyName.equals(JPATypeMock.PROPERTY_NAME_MSTRING) ||
           propertyName.equals(JPATypeMock.PROPERTY_NAME_ENUM) ||
@@ -300,6 +312,7 @@
       EasyMock.expect(edmProperty.getName()).andReturn(propertyName).anyTimes();
       EasyMock.expect(edmProperty.getMapping()).andReturn((EdmMapping) mockEdmMapping(null, propertyName, null))
           .anyTimes();
+      EasyMock.expect(edmProperty.getFacets()).andReturn(null).anyTimes();
 
     }
 
@@ -324,6 +337,14 @@
     if (complexTypeName.equals(JPATypeEmbeddableMock.ENTITY_NAME)) {
       EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT)).andReturn(
           mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT)).anyTimes();
+      EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE)).andReturn(
+          mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MDATE)).anyTimes();
+      EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1)).andReturn(
+          mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1)).anyTimes();
+      EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MTIME)).andReturn(
+          mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MTIME)).anyTimes();
+      EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)).andReturn(
+          mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)).anyTimes();
       EasyMock.expect(edmComplexType.getProperty(JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE)).andReturn(
           mockEdmProperty(complexTypeName, JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE)).anyTimes();
     } else if (complexTypeName.equals(JPATypeEmbeddableMock2.ENTITY_NAME)) {
@@ -397,10 +418,22 @@
       mapping.setJPAType(byte[].class);
       ((Mapping) mapping).setInternalName(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY);
     } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT)) {
-      mapping.setJPAType(Short.TYPE);
+      mapping.setJPAType(Short.class);
       ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT);
+    } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE)) {
+      mapping.setJPAType(java.util.Date.class);
+      ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE);
+    } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1)) {
+      mapping.setJPAType(java.sql.Date.class);
+      ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1);
+    } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME)) {
+      mapping.setJPAType(Time.class);
+      ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIME);
+    } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP)) {
+      mapping.setJPAType(Timestamp.class);
+      ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP);
     } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT)) {
-      mapping.setJPAType(Float.TYPE);
+      mapping.setJPAType(Float.class);
       ((Mapping) mapping).setInternalName(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT);
     } else if (propertyName.equals(JPATypeMock.JPATypeEmbeddableMock2.PROPERTY_NAME_MUUID)) {
       mapping.setJPAType(UUID.class);
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java
index 3d7ddcc..60b1c91 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/JPATypeMock.java
@@ -20,8 +20,11 @@
 
 import java.sql.Blob;
 import java.sql.Clob;
+import java.sql.Time;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
@@ -43,7 +46,7 @@
   public static final String PROPERTY_NAME_MKEY = "key";
   public static final String PROPERTY_NAME_MCOMPLEXTYPE = "complexType";
   public static final String PROPERTY_NAME_ENUM = "mSomeEnum";
-
+  
   public static final String NAVIGATION_PROPERTY_X = "mRelatedEntity";
   public static final String NAVIGATION_PROPERTY_XS = "mRelatedEntities";
 
@@ -99,7 +102,7 @@
   public void setMCharArray(final Character[] mCharArray) {
     this.mCharArray = mCharArray;
   }
-
+  
   private JPARelatedTypeMock mRelatedEntity;
   private List<JPARelatedTypeMock> mRelatedEntities = new ArrayList<JPATypeMock.JPARelatedTypeMock>();
 
@@ -181,15 +184,23 @@
     public static final String ENTITY_NAME = "JPATypeEmbeddableMock";
     public static final String PROPERTY_NAME_MSHORT = "mShort";
     public static final String PROPERTY_NAME_MEMBEDDABLE = "mEmbeddable";
+    public static final String PROPERTY_NAME_MDATE = "mDate";
+    public static final String PROPERTY_NAME_MDATE1 = "mDate1";
+    public static final String PROPERTY_NAME_MTIMESTAMP = "mTimestamp";
+    public static final String PROPERTY_NAME_MTIME = "mTime";
 
-    private short mShort;
+    private Short mShort;
     private JPATypeEmbeddableMock2 mEmbeddable;
+    private Date mDate;
+    private java.sql.Date mDate1;
+    private Timestamp mTimestamp;
+    private Time mTime;
 
-    public short getMShort() {
+    public Short getMShort() {
       return mShort;
     }
 
-    public void setMShort(final short mShort) {
+    public void setMShort(final Short mShort) {
       this.mShort = mShort;
     }
 
@@ -200,6 +211,38 @@
     public void setMEmbeddable(final JPATypeEmbeddableMock2 mEmbeddable) {
       this.mEmbeddable = mEmbeddable;
     }
+    
+    public Timestamp getMTimestamp() {
+      return mTimestamp;
+    }
+
+    public void setMTimestamp(final Timestamp mTimestamp) {
+      this.mTimestamp = mTimestamp;
+    }
+
+    public Time getMTime() {
+      return mTime;
+    }
+    
+    public void setMTime(final Time mTime) {
+      this.mTime = mTime;
+    }
+
+    public void setMDate(final Date mDate) {
+      this.mDate = mDate;
+    }
+    
+    public Date getMDate() {
+      return mDate;
+    }
+
+    public void setMDate1(final java.sql.Date mDate1) {
+      this.mDate1 = mDate1;
+    }
+    
+    public java.sql.Date getMDate1() {
+      return mDate1;
+    }
 
   }
 
@@ -211,7 +254,7 @@
     public static final String PROPERTY_NAME_MFLOAT = "mFloat";
 
     private UUID mUUID;
-    private float mFloat;
+    private Float mFloat;
 
     public UUID getMUUID() {
       return mUUID;
@@ -221,11 +264,11 @@
       this.mUUID = mUUID;
     }
 
-    public float getMFloat() {
+    public Float getMFloat() {
       return mFloat;
     }
 
-    public void setMFloat(final float mFloat) {
+    public void setMFloat(final Float mFloat) {
       this.mFloat = mFloat;
     }
 
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java
index e5a081c..a199329 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java
@@ -18,6 +18,8 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.jpa.processor.core.mock.data;
 
+import java.sql.Time;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
@@ -51,8 +53,12 @@
   public static final byte[] VALUE_MBYTEARRAY = new byte[] { 0XA, 0XB };
   public static final float VALUE_MFLOAT = 2.00F;
   public static final UUID VALUE_UUID = UUID.fromString("38400000-8cf0-11bd-b23e-10b96e4ef00d");
-  public static final short VALUE_SHORT = 2;
+  public static final Short VALUE_SHORT = 2;
   public static final JPATypeMock.JPATypeMockEnum VALUE_ENUM = JPATypeMock.JPATypeMockEnum.VALUE;
+  public static java.util.Date VALUE_DATE = null;
+  public static java.sql.Date VALUE_DATE1 = null;
+  public static Time VALUE_TIME = null;
+  public static Timestamp VALUE_TIMESTAMP = null;
 
   public static ODataEntry mockODataEntry(final String entityName) {
     ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class);
@@ -62,6 +68,26 @@
     EasyMock.replay(oDataEntry);
     return oDataEntry;
   }
+  
+  public static ODataEntry mockODataEntryWithNullValue(final String entityName) {
+    ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class);
+    Map<String, Object> propertiesMap = mockODataEntryProperties(entityName);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MINT, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCHAR, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_CLOB, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_ENUM, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MBLOB, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCARRAY, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MC, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCHARARRAY, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MDATETIME, null);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MSTRING, null);
+    EasyMock.expect(oDataEntry.getProperties()).andReturn(propertiesMap).anyTimes();
+
+    enhanceMockODataEntry(oDataEntry, false, new ArrayList<String>());
+    EasyMock.replay(oDataEntry);
+    return oDataEntry;
+  }
 
   public static ODataEntry mockODataEntryWithComplexType(final String entityName) {
     ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class);
@@ -72,6 +98,30 @@
     EasyMock.replay(oDataEntry);
     return oDataEntry;
   }
+  
+  @SuppressWarnings("unchecked")
+  public static ODataEntry mockODataEntryWithComplexTypeWithNullValue(final String entityName) {
+    ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class);
+    Map<String, Object> propertiesMap = mockODataEntryPropertiesWithComplexType(entityName);
+    propertiesMap.put(JPATypeMock.PROPERTY_NAME_MCARRAY, null);
+    Map<String, Object> complexPropertiesMap = (Map<String, Object>) propertiesMap.get
+        (JPATypeMock.PROPERTY_NAME_MCOMPLEXTYPE);
+    complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT, null);
+    complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE, null);
+    complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1, null);
+    complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIME, null);
+    complexPropertiesMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP, null);
+    Map<String, Object> embeddableMap = (Map<String, Object>) complexPropertiesMap.
+        get(JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE);
+    embeddableMap.put(JPATypeEmbeddableMock2.PROPERTY_NAME_MUUID, null);
+    embeddableMap.put(JPATypeEmbeddableMock2.PROPERTY_NAME_MFLOAT, null);
+    EasyMock.expect(oDataEntry.getProperties()).andReturn(propertiesMap)
+        .anyTimes();
+
+    enhanceMockODataEntry(oDataEntry, false, new ArrayList<String>());
+    EasyMock.replay(oDataEntry);
+    return oDataEntry;
+  }
 
   public static Map<String, Object> mockODataEntryProperties(final String entityName) {
     Map<String, Object> propertyMap = new HashMap<String, Object>();
@@ -100,6 +150,14 @@
       propertyMap.put(JPARelatedTypeMock.PROPERTY_NAME_MBYTEARRAY, VALUE_MBYTEARRAY);
     } else if (entityName.equals(JPATypeEmbeddableMock.ENTITY_NAME)) {
       propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MSHORT, VALUE_SHORT);
+      VALUE_DATE = Calendar.getInstance(TimeZone.getDefault()).getTime();
+      VALUE_DATE1 = new java.sql.Date(Calendar.getInstance(TimeZone.getDefault()).getTimeInMillis());
+      VALUE_TIME = new java.sql.Time(Calendar.getInstance(TimeZone.getDefault()).getTimeInMillis());
+      VALUE_TIMESTAMP = new Timestamp(Calendar.getInstance(TimeZone.getDefault()).getTimeInMillis());
+      propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE, Calendar.getInstance(TimeZone.getDefault()));
+      propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MDATE1, Calendar.getInstance(TimeZone.getDefault()));
+      propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIME, Calendar.getInstance(TimeZone.getDefault()));
+      propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MTIMESTAMP, Calendar.getInstance(TimeZone.getDefault()));
       propertyMap.put(JPATypeEmbeddableMock.PROPERTY_NAME_MEMBEDDABLE,
           mockODataEntryProperties(JPATypeEmbeddableMock2.ENTITY_NAME));
     } else if (entityName.equals(JPATypeEmbeddableMock2.ENTITY_NAME)) {
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java
index 5ec7647..a0397b6 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Material.java
@@ -56,7 +56,7 @@
   private String materialName;
 
   @Column(name = "PRICE")
-  private double price;
+  private Double price;
 
   @Column(name = "MEASUREMENT_UNIT")
   private String measurementUnit;
@@ -106,11 +106,11 @@
     this.materialName = materialName;
   }
 
-  public double getPrice() {
+  public Double getPrice() {
     return price;
   }
 
-  public void setPrice(final double price) {
+  public void setPrice(final Double price) {
     this.price = price;
   }
 
diff --git a/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties b/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties
index 5ee054c..b353545 100644
--- a/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties
+++ b/odata2-jpa-processor/jpa-web/src/main/resources/SQL_Insert_Material.properties
@@ -33,4 +33,6 @@
 material_query_14 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(124, 'TESTCHAR', 'E1', 3, 121.1, 'Piece');
 material_query_15 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(125, '%TESTCHAR%', 'E1', 3, 121.1, 'Piece');
 material_query_16 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(126, 'TEST%_%5CCHAR', 'E1', 3, 121.1, 'Piece');
-material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(127, 'TEST%_\\CCHAR', 'E1', 3, 121.1, 'Piece');
\ No newline at end of file
+material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(127, 'TEST%_\\CCHAR', 'E1', 3, 121.1, 'Piece');
+material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(128, null, 'S1', 2, 121.1, 'Piece');
+material_query_17 = insert into T_MATERIAL (MATERIAL_ID , MATERIAL_NAME, TYPE_CODE, CAT_ID, PRICE, MEASUREMENT_UNIT) values(129, null, 'E1', 3, null, 'Piece');
\ No newline at end of file