You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/01/17 15:10:59 UTC

[17/22] git commit: [OLINGO-51] Handle in Inline Entries - deep insert cases

[OLINGO-51] Handle <links> in Inline Entries - deep insert cases

Project: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/commit/6c8c2db5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/tree/6c8c2db5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/diff/6c8c2db5

Branch: refs/heads/olingo-117
Commit: 6c8c2db5f171274532abb03425d8df4c4e7c45c0
Parents: 0244da6
Author: Chandan V A <ch...@sap.com>
Authored: Wed Jan 15 17:37:34 2014 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Wed Jan 15 17:37:34 2014 +0530

----------------------------------------------------------------------
 .../jpa/processor/core/ODataEntityParser.java   |  2 +-
 .../processor/core/access/data/JPAEntity.java   | 10 +++-
 .../jpa/processor/core/access/data/JPALink.java | 50 ++++++++++++--------
 .../core/access/data/JPAProcessorImpl.java      |  4 +-
 .../core/access/data/JPAEntityTest.java         | 13 ++---
 .../core/mock/ODataJPAContextMock.java          |  9 ++++
 .../core/mock/data/ODataEntryMockUtil.java      | 13 +++--
 .../jpa/processor/ref/model/Customer.java       |  3 +-
 8 files changed, 67 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
index 0da3bcd..78bd1bc 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataEntityParser.java
@@ -135,7 +135,7 @@ public final class ODataEntityParser {
     return uriInfo;
   }
 
-  public UriInfo parseBindingLink(final String link, final Map<String, String> options) 
+  public UriInfo parseBindingLink(final String link, final Map<String, String> options)
       throws ODataJPARuntimeException {
     final PathSegment pathSegment = getPathSegment(link);
     UriInfo uriInfo = null;

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntity.java
----------------------------------------------------------------------
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 64b6f92..f6cf6c1 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
@@ -38,6 +38,7 @@ import org.apache.olingo.odata2.api.edm.EdmTypeKind;
 import org.apache.olingo.odata2.api.edm.EdmTyped;
 import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
 import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
+import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext;
 import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
 import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmMapping;
 
@@ -49,11 +50,14 @@ public class JPAEntity {
   private Class<?> jpaType = null;
   private HashMap<String, Method> accessModifiersWrite = null;
   private JPAEntityParser jpaEntityParser = null;
+  private ODataJPAContext oDataJPAContext;
   public HashMap<EdmNavigationProperty, EdmEntitySet> inlinedEntities = null;
 
-  public JPAEntity(final EdmEntityType oDataEntityType, final EdmEntitySet oDataEntitySet) {
+  public JPAEntity(final EdmEntityType oDataEntityType, final EdmEntitySet oDataEntitySet, 
+      final ODataJPAContext context) {
     this.oDataEntityType = oDataEntityType;
     this.oDataEntitySet = oDataEntitySet;
+    oDataJPAContext = context;
     try {
       JPAEdmMapping mapping = (JPAEdmMapping) oDataEntityType.getMapping();
       jpaType = mapping.getJPAType();
@@ -151,10 +155,12 @@ public class JPAEntity {
           EdmEntitySet edmRelatedEntitySet = oDataEntitySet.getRelatedEntitySet(navProperty);
           List<ODataEntry> relatedEntries = (List<ODataEntry>) oDataEntryProperties.get(propertyName);
           Collection<Object> relatedJPAEntites = instantiateRelatedJPAEntities(jpaEntity, navProperty);
-          JPAEntity relatedEntity = new JPAEntity((EdmEntityType) structuralType, edmRelatedEntitySet);
+          JPAEntity relatedEntity = new JPAEntity((EdmEntityType) structuralType, edmRelatedEntitySet, oDataJPAContext);
           for (ODataEntry oDataEntry : relatedEntries) {
             relatedEntity.create(oDataEntry);
             relatedJPAEntites.add(relatedEntity.getJPAEntity());
+            JPALink link = new JPALink(oDataJPAContext);
+            link.create(edmRelatedEntitySet, oDataEntry);
           }
 
           switch (navProperty.getMultiplicity()) {

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
index f3b821b..18b5664 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPALink.java
@@ -147,24 +147,24 @@ public class JPALink {
     }
   }
 
-  private void delinkJPAEntities(final Object targetJPAEntity,
+  private void delinkJPAEntities(final Object jpaEntity,
       final List<Object> relatedJPAEntities,
       final EdmNavigationProperty targetNavigationProperty)
       throws ODataJPARuntimeException {
 
     try {
       JPAEntityParser entityParser = new JPAEntityParser();
-      Method setMethod = entityParser.getAccessModifier(targetJPAEntity,
+      Method setMethod = entityParser.getAccessModifier(jpaEntity,
           targetNavigationProperty, JPAEntityParser.ACCESS_MODIFIER_SET);
 
-      Method getMethod = entityParser.getAccessModifier(targetJPAEntity,
+      Method getMethod = entityParser.getAccessModifier(jpaEntity,
           targetNavigationProperty, JPAEntityParser.ACCESS_MODIFIER_GET);
 
       if (getMethod.getReturnType().getTypeParameters() != null
           && getMethod.getReturnType().getTypeParameters().length != 0) {
-        setMethod.invoke(targetJPAEntity, relatedJPAEntities);
+        setMethod.invoke(jpaEntity, relatedJPAEntities);
       } else {
-        setMethod.invoke(targetJPAEntity, (Object) null);
+        setMethod.invoke(jpaEntity, (Object) null);
       }
     } catch (IllegalAccessException e) {
       throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.INNER_EXCEPTION, e);
@@ -192,10 +192,32 @@ public class JPALink {
 
   }
 
+  public void create(final EdmEntitySet entitySet, final ODataEntry oDataEntry) throws ODataJPARuntimeException,
+      ODataJPAModelException {
+    List<String> navPropertyNames;
+    try {
+      navPropertyNames = entitySet.getEntityType().getNavigationPropertyNames();
+      for (String navPropertyName : navPropertyNames) {
+        List<String> links = oDataEntry.getMetadata().getAssociationUris(navPropertyName);
+        if (links != null && links.isEmpty() == false) {
+          for (String link : links) {
+            UriInfo bindingUriInfo = parser.parseBindingLink(link, new HashMap<String, String>());
+            targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) bindingUriInfo);
+            linkJPAEntities(targetJPAEntity, sourceJPAEntity, (EdmNavigationProperty) entitySet.getEntityType()
+                .getProperty(
+                    navPropertyName));
+          }
+        }
+      }
+    } catch (EdmException e) {
+      throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
+    }
+
+  }
+
   public void create(final PostUriInfo uriInfo, final ODataEntry oDataEntry) throws ODataJPARuntimeException,
       ODataJPAModelException {
     try {
-      EdmEntitySet targetEntitySet = uriInfo.getTargetEntitySet();
       int index = context.getODataContext().getPathInfo().getODataSegments().size() - 2;
       UriInfo parsedUriInfo = parser.parseURISegment(index, index + 1);
       Object targetJPAEntity = null;
@@ -210,22 +232,8 @@ public class JPALink {
             .getNavigationProperty());
       }
 
-      List<String> navPropertyNames;
-      navPropertyNames = targetEntitySet.getEntityType().getNavigationPropertyNames();
-
-      for (String navPropertyName : navPropertyNames) {
-        List<String> links = oDataEntry.getMetadata().getAssociationUris(navPropertyName);
-        if (links != null && links.isEmpty() == false) {
-          for (String link : links) {
-            UriInfo bindingUriInfo = parser.parseBindingLink(link, new HashMap<String, String>());
-            targetJPAEntity = jpaProcessor.process((GetEntityUriInfo) bindingUriInfo);
+      create(uriInfo.getTargetEntitySet(), oDataEntry);
 
-            linkJPAEntities(targetJPAEntity, sourceJPAEntity, (EdmNavigationProperty) targetEntitySet.getEntityType()
-                .getProperty(
-                    navPropertyName));
-          }
-        }
-      }
     } catch (EdmException e) {
       throw ODataJPARuntimeException.throwException(ODataJPARuntimeException.GENERAL.addContent(e.getMessage()), e);
     } catch (ODataException e) {

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
index 9a5b101..1a8a0f0 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
@@ -305,7 +305,7 @@ public class JPAProcessorImpl implements JPAProcessor {
 
       final EdmEntitySet oDataEntitySet = createView.getTargetEntitySet();
       final EdmEntityType oDataEntityType = oDataEntitySet.getEntityType();
-      final JPAEntity virtualJPAEntity = new JPAEntity(oDataEntityType, oDataEntitySet);
+      final JPAEntity virtualJPAEntity = new JPAEntity(oDataEntityType, oDataEntitySet, oDataJPAContext);
       final List<Object> createList = new ArrayList<Object>();
       Object jpaEntity = null;
 
@@ -368,7 +368,7 @@ public class JPAProcessorImpl implements JPAProcessor {
 
       final EdmEntitySet oDataEntitySet = updateView.getTargetEntitySet();
       final EdmEntityType oDataEntityType = oDataEntitySet.getEntityType();
-      final JPAEntity virtualJPAEntity = new JPAEntity(oDataEntityType, oDataEntitySet);
+      final JPAEntity virtualJPAEntity = new JPAEntity(oDataEntityType, oDataEntitySet, oDataJPAContext);
       virtualJPAEntity.setJPAEntity(jpaEntity);
 
       if (content != null) {

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
----------------------------------------------------------------------
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 6b81805..caf3167 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
@@ -28,6 +28,7 @@ import org.apache.olingo.odata2.api.edm.EdmEntityType;
 import org.apache.olingo.odata2.api.edm.EdmException;
 import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
 import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
+import org.apache.olingo.odata2.jpa.processor.core.mock.ODataJPAContextMock;
 import org.apache.olingo.odata2.jpa.processor.core.mock.data.EdmMockUtilV2;
 import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock;
 import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPARelatedTypeMock;
@@ -46,7 +47,7 @@ public class JPAEntityTest {
       EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, true);
       EdmEntityType edmEntityType = edmEntitySet.getEntityType();
 
-      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet);
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, null);
       jpaEntity.create(ODataEntryMockUtil.mockODataEntryWithComplexType(JPATypeMock.ENTITY_NAME));
     } catch (ODataJPARuntimeException e) {
       fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
@@ -75,7 +76,7 @@ public class JPAEntityTest {
       EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false);
       EdmEntityType edmEntityType = edmEntitySet.getEntityType();
 
-      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet);
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, null);
       jpaEntity.create(ODataEntryMockUtil.mockODataEntry(JPATypeMock.ENTITY_NAME));
     } catch (ODataJPARuntimeException e) {
       fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
@@ -96,7 +97,7 @@ public class JPAEntityTest {
       EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false);
       EdmEntityType edmEntityType = edmEntitySet.getEntityType();
 
-      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet);
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, ODataJPAContextMock.mockODataJPAContext());
       jpaEntity.create(ODataEntryMockUtil.mockODataEntryWithInline(JPATypeMock.ENTITY_NAME));
     } catch (ODataJPARuntimeException e) {
       fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
@@ -124,7 +125,7 @@ public class JPAEntityTest {
       EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false);
       EdmEntityType edmEntityType = edmEntitySet.getEntityType();
 
-      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet);
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, null);
       jpaEntity.create(ODataEntryMockUtil.mockODataEntryProperties(JPATypeMock.ENTITY_NAME));
     } catch (ODataJPARuntimeException e) {
       fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage()
@@ -145,7 +146,7 @@ public class JPAEntityTest {
       EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false);
       EdmEntityType edmEntityType = edmEntitySet.getEntityType();
 
-      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet);
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, null);
       JPATypeMock jpaTypeMock = new JPATypeMock();
       jpaEntity.setJPAEntity(jpaTypeMock);
       jpaEntity.update(ODataEntryMockUtil.mockODataEntry(JPATypeMock.ENTITY_NAME));
@@ -168,7 +169,7 @@ public class JPAEntityTest {
       EdmEntitySet edmEntitySet = EdmMockUtilV2.mockEdmEntitySet(JPATypeMock.ENTITY_NAME, false);
       EdmEntityType edmEntityType = edmEntitySet.getEntityType();
 
-      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet);
+      jpaEntity = new JPAEntity(edmEntityType, edmEntitySet, null);
       JPATypeMock jpaTypeMock = new JPATypeMock();
       jpaEntity.setJPAEntity(jpaTypeMock);
       jpaEntity.update(ODataEntryMockUtil.mockODataEntryProperties(JPATypeMock.ENTITY_NAME));

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java
index 4d00503..17464a4 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/ODataJPAContextMock.java
@@ -18,6 +18,7 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.jpa.processor.core.mock;
 
+import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.metamodel.Metamodel;
 
@@ -35,6 +36,7 @@ public abstract class ODataJPAContextMock {
     ODataJPAContext odataJPAContext = EasyMock.createMock(ODataJPAContext.class);
     EasyMock.expect(odataJPAContext.getPersistenceUnitName()).andStubReturn(NAMESPACE);
     EasyMock.expect(odataJPAContext.getEntityManagerFactory()).andReturn(mockEntityManagerFactory());
+    EasyMock.expect(odataJPAContext.getEntityManager()).andReturn(mockEntityManager());
     EasyMock.expect(odataJPAContext.getJPAEdmMappingModel()).andReturn(MAPPING_MODEL);
     EasyMock.expect(odataJPAContext.getJPAEdmExtension()).andReturn(null);
     EasyMock.expect(odataJPAContext.getDefaultNaming()).andReturn(true);
@@ -56,6 +58,13 @@ public abstract class ODataJPAContextMock {
     return odataJPAContext;
   }
 
+  private static EntityManager mockEntityManager() {
+    EntityManager em = EasyMock.createMock(EntityManager.class);
+    EasyMock.replay(em);
+    return em;
+
+  }
+
   private static EntityManagerFactory mockEntityManagerFactory() {
     EntityManagerFactory emf = EasyMock.createMock(EntityManagerFactory.class);
     EasyMock.expect(emf.getMetamodel()).andReturn(mockMetaModel());

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/mock/data/ODataEntryMockUtil.java
----------------------------------------------------------------------
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 92912cc..019bfb6 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
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.TimeZone;
 import java.util.UUID;
 
+import org.apache.olingo.odata2.api.ep.entry.EntryMetadata;
 import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
 import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
 import org.apache.olingo.odata2.jpa.processor.core.mock.data.JPATypeMock.JPARelatedTypeMock;
@@ -50,7 +51,11 @@ public class ODataEntryMockUtil {
     ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class);
     EasyMock.expect(oDataEntry.getProperties()).andReturn(mockODataEntryProperties(entityName)).anyTimes();
 
-    EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(false);
+    EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(false).anyTimes();
+    EntryMetadata entryMetadata = EasyMock.createMock(EntryMetadata.class);
+    EasyMock.expect(entryMetadata.getAssociationUris(EasyMock.isA(String.class))).andReturn(null).anyTimes();
+    EasyMock.replay(entryMetadata);
+    EasyMock.expect(oDataEntry.getMetadata()).andReturn(entryMetadata).anyTimes();
     EasyMock.replay(oDataEntry);
     return oDataEntry;
   }
@@ -60,7 +65,7 @@ public class ODataEntryMockUtil {
     EasyMock.expect(oDataEntry.getProperties()).andReturn(mockODataEntryPropertiesWithComplexType(entityName))
         .anyTimes();
 
-    EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(false);
+    EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(false).anyTimes();
     EasyMock.replay(oDataEntry);
     return oDataEntry;
   }
@@ -117,9 +122,9 @@ public class ODataEntryMockUtil {
     ODataEntry oDataEntry = EasyMock.createMock(ODataEntry.class);
     EasyMock.expect(oDataEntry.getProperties()).andReturn(mockODataEntryPropertiesWithInline(entityName)).anyTimes();
     if (entityName.equals(JPATypeMock.ENTITY_NAME)) {
-      EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(true);
+      EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(true).anyTimes();
     } else {
-      EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(false);
+      EasyMock.expect(oDataEntry.containsInlineEntry()).andReturn(false).anyTimes();
     }
     EasyMock.replay(oDataEntry);
     return oDataEntry;

http://git-wip-us.apache.org/repos/asf/incubator-olingo-odata2/blob/6c8c2db5/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Customer.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Customer.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Customer.java
index 18f24b4..0e51e48 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Customer.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/Customer.java
@@ -21,6 +21,7 @@ package org.apache.olingo.odata2.jpa.processor.ref.model;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Embedded;
 import javax.persistence.Entity;
@@ -42,7 +43,7 @@ public class Customer {
   @Embedded
   private Address address;
 
-  @OneToMany(mappedBy = "customer")
+  @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
   private List<SalesOrderHeader> orders = new ArrayList<SalesOrderHeader>();
 
   public Long getId() {