You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/10/18 12:56:00 UTC

git commit: [OLINGO-458] - JPA Batch requests are not executed in a single database transaction

Repository: olingo-odata2
Updated Branches:
  refs/heads/master 5a416b9e6 -> 28e28212f


[OLINGO-458] - JPA Batch requests are not executed in a single database
transaction

Fixed -  Handling of all requests in a changeset as one single database
transaction.

Fixed - Issue with Default Naming when there is no Join Column/Column
Name specified.

Signed-off-by: Chandan V A <ch...@sap.com>

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

Branch: refs/heads/master
Commit: 28e28212f386c8f19feb9321d770c7683d09788a
Parents: 5a416b9
Author: Chandan V A <ch...@sap.com>
Authored: Sat Oct 18 15:35:21 2014 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Sat Oct 18 15:35:21 2014 +0530

----------------------------------------------------------------------
 .../core/ODataJPAProcessorDefault.java          |  32 +-
 .../core/access/data/JPAProcessorImpl.java      | 300 ++++++++++---------
 .../core/access/model/JPAEdmNameBuilder.java    |  12 +-
 .../processor/core/model/JPAEdmProperty.java    |  11 +-
 .../model/JPAEdmReferentialConstraintRole.java  |   6 +-
 .../core/ODataJPAProcessorDefaultTest.java      |   1 +
 .../core/access/data/JPAProcessorImplTest.java  |   1 +
 .../jpa/processor/ref/model/SalesOrderItem.java |   4 +-
 .../src/main/resources/META-INF/persistence.xml |   4 +-
 .../ref/web/JPAReferenceServiceFactory.java     |   2 +-
 .../jpa-web/src/main/webapp/index.jsp           |   6 +-
 11 files changed, 211 insertions(+), 168 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
index 6512b79..bc820ba 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefault.java
@@ -219,27 +219,41 @@ public class ODataJPAProcessorDefault extends ODataJPAProcessor {
     PathInfo pathInfo = getContext().getPathInfo();
     EntityProviderBatchProperties batchProperties = EntityProviderBatchProperties.init().pathInfo(pathInfo).build();
     List<BatchRequestPart> batchParts = EntityProvider.parseBatchRequest(contentType, content, batchProperties);
+
     for (BatchRequestPart batchPart : batchParts) {
       batchResponseParts.add(handler.handleBatchPart(batchPart));
     }
     batchResponse = EntityProvider.writeBatchResponse(batchResponseParts);
     return batchResponse;
+
   }
 
   @Override
   public BatchResponsePart executeChangeSet(final BatchHandler handler, final List<ODataRequest> requests)
       throws ODataException {
     List<ODataResponse> responses = new ArrayList<ODataResponse>();
-    for (ODataRequest request : requests) {
-      ODataResponse response = handler.handleRequest(request);
-      if (response.getStatus().getStatusCode() >= HttpStatusCodes.BAD_REQUEST.getStatusCode()) {
-        // Rollback
-        List<ODataResponse> errorResponses = new ArrayList<ODataResponse>(1);
-        errorResponses.add(response);
-        return BatchResponsePart.responses(errorResponses).changeSet(false).build();
+    try {
+      oDataJPAContext.getEntityManager().getTransaction().begin();
+
+      for (ODataRequest request : requests) {
+        ODataResponse response = handler.handleRequest(request);
+        if (response.getStatus().getStatusCode() >= HttpStatusCodes.BAD_REQUEST.getStatusCode()) {
+          // Rollback
+          oDataJPAContext.getEntityManager().getTransaction().rollback();
+          List<ODataResponse> errorResponses = new ArrayList<ODataResponse>(1);
+          errorResponses.add(response);
+          return BatchResponsePart.responses(errorResponses).changeSet(false).build();
+        }
+        responses.add(response);
       }
-      responses.add(response);
+      oDataJPAContext.getEntityManager().getTransaction().commit();
+
+      return BatchResponsePart.responses(responses).changeSet(true).build();
+    } catch (Exception e) {
+      
+      List<ODataResponse> errorResponses = new ArrayList<ODataResponse>(1);
+      errorResponses.add(ODataResponse.entity(e).status(HttpStatusCodes.INTERNAL_SERVER_ERROR).build());
+      return BatchResponsePart.responses(errorResponses).changeSet(false).build();
     }
-    return BatchResponsePart.responses(responses).changeSet(true).build();
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/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 8c497d3..814a053 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
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 
 import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
 import javax.persistence.Query;
 
 import org.apache.olingo.odata2.api.commons.InlineCount;
@@ -203,53 +204,6 @@ public class JPAProcessorImpl implements JPAProcessor {
     }
   }
 
-  private List<Object> handlePaging(final List<Object> result, final GetEntitySetUriInfo uriParserResultView) {
-    if (result == null) {
-      return null;
-    }
-    JPAPageBuilder pageBuilder = new JPAPageBuilder();
-    pageBuilder.pageSize(oDataJPAContext.getPageSize())
-        .entities(result)
-        .skipToken(uriParserResultView.getSkipToken());
-
-    // $top/$skip with $inlinecount case handled in response builder to avoid multiple DB call
-    if (uriParserResultView.getSkip() != null && uriParserResultView.getInlineCount() == null) {
-      pageBuilder.skip(uriParserResultView.getSkip().intValue());
-    }
-
-    if (uriParserResultView.getTop() != null && uriParserResultView.getInlineCount() == null) {
-      pageBuilder.top(uriParserResultView.getTop().intValue());
-    }
-
-    JPAPage page = pageBuilder.build();
-    oDataJPAContext.setPaging(page);
-
-    return page.getPagedEntities();
-  }
-
-  private List<Object> handlePaging(final Query query, final GetEntitySetUriInfo uriParserResultView) {
-
-    JPAPageBuilder pageBuilder = new JPAPageBuilder();
-    pageBuilder.pageSize(oDataJPAContext.getPageSize())
-        .query(query)
-        .skipToken(uriParserResultView.getSkipToken());
-
-    // $top/$skip with $inlinecount case handled in response builder to avoid multiple DB call
-    if (uriParserResultView.getSkip() != null && uriParserResultView.getInlineCount() == null) {
-      pageBuilder.skip(uriParserResultView.getSkip().intValue());
-    }
-
-    if (uriParserResultView.getTop() != null && uriParserResultView.getInlineCount() == null) {
-      pageBuilder.top(uriParserResultView.getTop().intValue());
-    }
-
-    JPAPage page = pageBuilder.build();
-    oDataJPAContext.setPaging(page);
-
-    return page.getPagedEntities();
-
-  }
-
   /* Process Get Entity Request (Read) */
   @Override
   public <T> Object process(GetEntityUriInfo uriParserResultView)
@@ -378,12 +332,115 @@ public class JPAProcessorImpl implements JPAProcessor {
     return processUpdate(updateView, null, content, null);
   }
 
+  /* Process Delete Entity Request */
+  @Override
+  public Object process(DeleteUriInfo uriParserResultView, final String contentType)
+      throws ODataJPAModelException, ODataJPARuntimeException {
+    JPQLContextType contextType = null;
+    try {
+      if (uriParserResultView instanceof DeleteUriInfo) {
+        if (((UriInfo) uriParserResultView).isLinks()) {
+          return deleteLink(uriParserResultView);
+        }
+        uriParserResultView = ((DeleteUriInfo) uriParserResultView);
+        if (!((DeleteUriInfo) uriParserResultView).getStartEntitySet().getName()
+            .equals(((DeleteUriInfo) uriParserResultView).getTargetEntitySet().getName())) {
+          contextType = JPQLContextType.JOIN_SINGLE;
+        } else {
+          contextType = JPQLContextType.SELECT_SINGLE;
+        }
+      }
+    } catch (EdmException e) {
+      ODataJPARuntimeException.throwException(
+          ODataJPARuntimeException.GENERAL, e);
+    }
+
+    Object selectedObject = readEntity(uriParserResultView, contextType);
+    if (selectedObject != null) {
+      try {
+        boolean isLocalTransaction = setTransaction();
+        em.remove(selectedObject);
+        em.flush();
+        if (isLocalTransaction) {
+          em.getTransaction().commit();
+        }
+
+      } catch (Exception e) {
+        throw ODataJPARuntimeException.throwException(
+            ODataJPARuntimeException.ERROR_JPQL_DELETE_REQUEST, e);
+      }
+    }
+    return selectedObject;
+  }
+
+  /* Process Get Entity Link Request */
+  @Override
+  public Object process(final GetEntityLinkUriInfo uriParserResultView)
+      throws ODataJPAModelException, ODataJPARuntimeException {
+
+    return this.process((GetEntityUriInfo) uriParserResultView);
+  }
+
+  /* Process Get Entity Set Link Request */
+  @Override
+  public List<Object> process(final GetEntitySetLinksUriInfo uriParserResultView)
+      throws ODataJPAModelException, ODataJPARuntimeException {
+    return this.process((GetEntitySetUriInfo) uriParserResultView);
+  }
+
+  @Override
+  public void process(final PostUriInfo uriInfo,
+      final InputStream content, final String requestContentType, final String contentType)
+      throws ODataJPARuntimeException, ODataJPAModelException {
+    JPALink link = new JPALink(oDataJPAContext);
+    link.create(uriInfo, content, requestContentType, contentType);
+    link.save();
+  }
+
+  @Override
+  public void process(final PutMergePatchUriInfo putUriInfo,
+      final InputStream content, final String requestContentType, final String contentType)
+      throws ODataJPARuntimeException, ODataJPAModelException {
+
+    JPALink link = new JPALink(oDataJPAContext);
+    link.update(putUriInfo, content, requestContentType, contentType);
+    link.save();
+
+  }
+
+  /* Common method for Read and Delete */
+  private Object readEntity(final Object uriParserResultView, final JPQLContextType contextType)
+      throws ODataJPAModelException, ODataJPARuntimeException {
+
+    Object selectedObject = null;
+
+    if (uriParserResultView instanceof DeleteUriInfo || uriParserResultView instanceof GetEntityUriInfo
+        || uriParserResultView instanceof PutMergePatchUriInfo) {
+
+      JPQLContext selectJPQLContext = JPQLContext.createBuilder(
+          contextType, uriParserResultView).build();
+
+      JPQLStatement selectJPQLStatement = JPQLStatement.createBuilder(
+          selectJPQLContext).build();
+      Query query = null;
+      try {
+        query = em.createQuery(selectJPQLStatement.toString());
+        if (!query.getResultList().isEmpty()) {
+          selectedObject = query.getResultList().get(0);
+        }
+      } catch (IllegalArgumentException e) {
+        throw ODataJPARuntimeException.throwException(
+            ODataJPARuntimeException.ERROR_JPQL_QUERY_CREATE, e);
+      }
+    }
+    return selectedObject;
+  }
+
   private Object processCreate(final PostUriInfo createView, final InputStream content,
       final Map<String, Object> properties,
       final String requestedContentType) throws ODataJPAModelException,
       ODataJPARuntimeException {
     try {
-
       final EdmEntitySet oDataEntitySet = createView.getTargetEntitySet();
       final EdmEntityType oDataEntityType = oDataEntitySet.getEntityType();
       final JPAEntity virtualJPAEntity = new JPAEntity(oDataEntityType, oDataEntitySet, oDataJPAContext);
@@ -400,15 +457,15 @@ public class JPAProcessorImpl implements JPAProcessor {
         return null;
       }
 
-      em.getTransaction().begin();
+      boolean isLocalTransaction = setTransaction();
       jpaEntity = virtualJPAEntity.getJPAEntity();
 
       em.persist(jpaEntity);
       if (em.contains(jpaEntity)) {
-        em.getTransaction().commit();
-
+        if (isLocalTransaction) {
+          em.getTransaction().commit();
+        }
         return jpaEntity;
-
       }
     } catch (Exception e) {
       throw ODataJPARuntimeException.throwException(
@@ -417,13 +474,13 @@ public class JPAProcessorImpl implements JPAProcessor {
     return null;
   }
 
-  public <T> Object processUpdate(PutMergePatchUriInfo updateView,
+  private <T> Object processUpdate(PutMergePatchUriInfo updateView,
       final InputStream content, final Map<String, Object> properties, final String requestContentType)
       throws ODataJPAModelException, ODataJPARuntimeException {
     JPQLContextType contextType = null;
     Object jpaEntity = null;
     try {
-      em.getTransaction().begin();
+      boolean isLocalTransaction = setTransaction();
       if (updateView instanceof PutMergePatchUriInfo) {
         updateView = ((PutMergePatchUriInfo) updateView);
         if (!((PutMergePatchUriInfo) updateView).getStartEntitySet().getName()
@@ -456,7 +513,9 @@ public class JPAProcessorImpl implements JPAProcessor {
         return null;
       }
       em.flush();
-      em.getTransaction().commit();
+      if (isLocalTransaction) {
+        em.getTransaction().commit();
+      }
     } catch (Exception e) {
       throw ODataJPARuntimeException.throwException(
           ODataJPARuntimeException.ERROR_JPQL_UPDATE_REQUEST, e);
@@ -465,45 +524,6 @@ public class JPAProcessorImpl implements JPAProcessor {
     return jpaEntity;
   }
 
-  /* Process Delete Entity Request */
-  @Override
-  public Object process(DeleteUriInfo uriParserResultView, final String contentType)
-      throws ODataJPAModelException, ODataJPARuntimeException {
-    JPQLContextType contextType = null;
-    try {
-      if (uriParserResultView instanceof DeleteUriInfo) {
-        if (((UriInfo) uriParserResultView).isLinks()) {
-          return deleteLink(uriParserResultView);
-        }
-        uriParserResultView = ((DeleteUriInfo) uriParserResultView);
-        if (!((DeleteUriInfo) uriParserResultView).getStartEntitySet().getName()
-            .equals(((DeleteUriInfo) uriParserResultView).getTargetEntitySet().getName())) {
-          contextType = JPQLContextType.JOIN_SINGLE;
-        } else {
-          contextType = JPQLContextType.SELECT_SINGLE;
-        }
-      }
-    } catch (EdmException e) {
-      ODataJPARuntimeException.throwException(
-          ODataJPARuntimeException.GENERAL, e);
-    }
-
-    Object selectedObject = readEntity(uriParserResultView, contextType);
-    if (selectedObject != null) {
-      try {
-        em.getTransaction().begin();
-        em.remove(selectedObject);
-        em.flush();
-        em.getTransaction().commit();
-
-      } catch (Exception e) {
-        throw ODataJPARuntimeException.throwException(
-            ODataJPARuntimeException.ERROR_JPQL_DELETE_REQUEST, e);
-      }
-    }
-    return selectedObject;
-  }
-
   private Object deleteLink(final DeleteUriInfo uriParserResultView) throws ODataJPARuntimeException {
     JPALink link = new JPALink(oDataJPAContext);
     link.delete(uriParserResultView);
@@ -511,66 +531,60 @@ public class JPAProcessorImpl implements JPAProcessor {
     return link.getTargetJPAEntity();
   }
 
-  /* Process Get Entity Link Request */
-  @Override
-  public Object process(final GetEntityLinkUriInfo uriParserResultView)
-      throws ODataJPAModelException, ODataJPARuntimeException {
+  private List<Object> handlePaging(final List<Object> result, final GetEntitySetUriInfo uriParserResultView) {
+    if (result == null) {
+      return null;
+    }
+    JPAPageBuilder pageBuilder = new JPAPageBuilder();
+    pageBuilder.pageSize(oDataJPAContext.getPageSize())
+        .entities(result)
+        .skipToken(uriParserResultView.getSkipToken());
 
-    return this.process((GetEntityUriInfo) uriParserResultView);
-  }
+    // $top/$skip with $inlinecount case handled in response builder to avoid multiple DB call
+    if (uriParserResultView.getSkip() != null && uriParserResultView.getInlineCount() == null) {
+      pageBuilder.skip(uriParserResultView.getSkip().intValue());
+    }
 
-  /* Process Get Entity Set Link Request */
-  @Override
-  public List<Object> process(final GetEntitySetLinksUriInfo uriParserResultView)
-      throws ODataJPAModelException, ODataJPARuntimeException {
-    return this.process((GetEntitySetUriInfo) uriParserResultView);
-  }
+    if (uriParserResultView.getTop() != null && uriParserResultView.getInlineCount() == null) {
+      pageBuilder.top(uriParserResultView.getTop().intValue());
+    }
 
-  @Override
-  public void process(final PostUriInfo uriInfo,
-      final InputStream content, final String requestContentType, final String contentType)
-      throws ODataJPARuntimeException, ODataJPAModelException {
-    JPALink link = new JPALink(oDataJPAContext);
-    link.create(uriInfo, content, requestContentType, contentType);
-    link.save();
-  }
+    JPAPage page = pageBuilder.build();
+    oDataJPAContext.setPaging(page);
 
-  /* Common method for Read and Delete */
-  private Object readEntity(final Object uriParserResultView, final JPQLContextType contextType)
-      throws ODataJPAModelException, ODataJPARuntimeException {
+    return page.getPagedEntities();
+  }
 
-    Object selectedObject = null;
+  private List<Object> handlePaging(final Query query, final GetEntitySetUriInfo uriParserResultView) {
 
-    if (uriParserResultView instanceof DeleteUriInfo || uriParserResultView instanceof GetEntityUriInfo
-        || uriParserResultView instanceof PutMergePatchUriInfo) {
+    JPAPageBuilder pageBuilder = new JPAPageBuilder();
+    pageBuilder.pageSize(oDataJPAContext.getPageSize())
+        .query(query)
+        .skipToken(uriParserResultView.getSkipToken());
 
-      JPQLContext selectJPQLContext = JPQLContext.createBuilder(
-          contextType, uriParserResultView).build();
+    // $top/$skip with $inlinecount case handled in response builder to avoid multiple DB call
+    if (uriParserResultView.getSkip() != null && uriParserResultView.getInlineCount() == null) {
+      pageBuilder.skip(uriParserResultView.getSkip().intValue());
+    }
 
-      JPQLStatement selectJPQLStatement = JPQLStatement.createBuilder(
-          selectJPQLContext).build();
-      Query query = null;
-      try {
-        query = em.createQuery(selectJPQLStatement.toString());
-        if (!query.getResultList().isEmpty()) {
-          selectedObject = query.getResultList().get(0);
-        }
-      } catch (IllegalArgumentException e) {
-        throw ODataJPARuntimeException.throwException(
-            ODataJPARuntimeException.ERROR_JPQL_QUERY_CREATE, e);
-      }
+    if (uriParserResultView.getTop() != null && uriParserResultView.getInlineCount() == null) {
+      pageBuilder.top(uriParserResultView.getTop().intValue());
     }
-    return selectedObject;
-  }
 
-  @Override
-  public void process(final PutMergePatchUriInfo putUriInfo,
-      final InputStream content, final String requestContentType, final String contentType)
-      throws ODataJPARuntimeException, ODataJPAModelException {
+    JPAPage page = pageBuilder.build();
+    oDataJPAContext.setPaging(page);
 
-    JPALink link = new JPALink(oDataJPAContext);
-    link.update(putUriInfo, content, requestContentType, contentType);
-    link.save();
+    return page.getPagedEntities();
+
+  }
+
+  private boolean setTransaction() {
+    final EntityTransaction transaction = em.getTransaction();
+    if (!transaction.isActive()) {
+      em.getTransaction().begin();
+      return true;
+    }
 
+    return false;
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
index edd4bb9..1016f9e 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/model/JPAEdmNameBuilder.java
@@ -148,7 +148,7 @@ public class JPAEdmNameBuilder {
       propertyName = jpaAttributeName;
       if (isForeignKey == true) {
         joinColumnNames = view.getJPAJoinColumns().get(view.getJPAJoinColumns().size() - 1);
-        propertyName = mappingModelAccess.mapJPAAttribute(view.getJPAEdmEntityTypeView().getJPAEntityType().getName(), 
+        propertyName = mappingModelAccess.mapJPAAttribute(view.getJPAEdmEntityTypeView().getJPAEntityType().getName(),
             joinColumnNames[0]);
         if (propertyName == null) {
           propertyName = FK_PREFIX + UNDERSCORE + joinColumnNames[0];
@@ -166,11 +166,13 @@ public class JPAEdmNameBuilder {
       Column column = annotatedElement.getAnnotation(Column.class);
       if (column != null) {
         mapping.setJPAColumnName(column.name());
+      } else if (joinColumnNames != null) {
+        mapping.setJPAColumnName(joinColumnNames[0]);
       } else {
-        if (joinColumnNames != null) {
-          mapping.setJPAColumnName(joinColumnNames[0]);
-          jpaAttributeName += "." + view.getJPAReferencedAttribute().getName();
-        }
+        mapping.setJPAColumnName(jpaAttributeName);
+      }
+      if (isForeignKey) {
+        jpaAttributeName += "." + view.getJPAReferencedAttribute().getName();
       }
     } else {
       ManagedType<?> managedType = jpaAttribute.getDeclaringType();

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
index fd14794..33f0c93 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmProperty.java
@@ -377,7 +377,16 @@ public class JPAEdmProperty extends JPAEdmBaseViewImpl implements
         for (Attribute<?, ?> referencedAttribute : referencedEntityType.getAttributes()) {
           if (referencedAttribute.getPersistentAttributeType() == PersistentAttributeType.BASIC &&
               ((SingularAttribute<?, ?>) referencedAttribute).isId()) {
-            name[1] = referencedAttribute.getName();
+            AnnotatedElement annotatedElement = (AnnotatedElement) referencedAttribute.getJavaMember();
+            Column referencedColumn = null;
+            if (annotatedElement != null) {
+              referencedColumn = annotatedElement.getAnnotation(Column.class);
+            }
+            if (referencedColumn != null) {
+              name[1] = referencedColumn.name();
+            } else {
+              name[1] = referencedAttribute.getName();
+            }
             joinColumnNames.add(name);
             currentRefAttribute = referencedAttribute;
             break;

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
index 94905e9..eeaaefa 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/model/JPAEdmReferentialConstraintRole.java
@@ -144,6 +144,7 @@ public class JPAEdmReferentialConstraintRole extends JPAEdmBaseViewImpl implemen
       if (currentRole == null) {
         currentRole = new ReferentialConstraintRole();
         String jpaAttributeType = null;
+        String jpaColumnName = null;
         EntityType edmEntityType = null;
 
         if (roleType == RoleType.PRINCIPAL) {
@@ -165,9 +166,10 @@ public class JPAEdmReferentialConstraintRole extends JPAEdmBaseViewImpl implemen
         if (edmEntityType != null) {
           for (String[] columnName : jpaColumnNames) {
             for (Property property : edmEntityType.getProperties()) {
-              if (columnName[0].equals(((JPAEdmMapping) property.getMapping()).getJPAColumnName()) ||
+              jpaColumnName = ((JPAEdmMapping) property.getMapping()).getJPAColumnName();
+              if (columnName[0].equals(jpaColumnName) ||
                   columnName[0].equals(property.getName()) ||
-                  columnName[1].equals(((JPAEdmMapping) property.getMapping()).getJPAColumnName()) ||
+                  columnName[1].equals(jpaColumnName) ||
                   columnName[1].equals(property.getName())) {
                 PropertyRef propertyRef = new PropertyRef();
                 propertyRef.setName(property.getName());

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
index 6317a4b..dc90021 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAProcessorDefaultTest.java
@@ -360,6 +360,7 @@ public class ODataJPAProcessorDefaultTest extends JPAEdmTestModelView {
     entityTransaction.begin(); // testing void method
     entityTransaction.commit();// testing void method
     entityTransaction.rollback();// testing void method
+    EasyMock.expect(entityTransaction.isActive()).andReturn(false);
     EasyMock.replay(entityTransaction);
     return entityTransaction;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
index e74dc52..b79fac4 100644
--- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
+++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImplTest.java
@@ -321,6 +321,7 @@ public class JPAProcessorImplTest {
     entityTransaction.begin(); // testing void method
     entityTransaction.commit();// testing void method
     entityTransaction.commit();// testing void method
+    EasyMock.expect(entityTransaction.isActive()).andReturn(false).anyTimes();
     EasyMock.replay(entityTransaction);
     return entityTransaction;
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
index 6da7a3c..35482ad 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
@@ -61,11 +61,11 @@ public class SalesOrderItem {
   @Column
   private boolean delivered;
 
-  public Boolean isDelivered() {
+  public boolean isDelivered() {
     return delivered;
   }
 
-  public void setDelivered(final Boolean deliveryStatus) {
+  public void setDelivered(final boolean deliveryStatus) {
     delivered = deliveryStatus;
   }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-ref/src/main/resources/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/resources/META-INF/persistence.xml b/odata2-jpa-processor/jpa-ref/src/main/resources/META-INF/persistence.xml
index 023aee1..450c73b 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/resources/META-INF/persistence.xml
+++ b/odata2-jpa-processor/jpa-ref/src/main/resources/META-INF/persistence.xml
@@ -22,9 +22,9 @@
 		<class>org.apache.olingo.odata2.jpa.processor.ref.model.Customer</class>
 		<class>org.apache.olingo.odata2.jpa.processor.ref.model.Category</class>
 		<class>org.apache.olingo.odata2.jpa.processor.ref.model.Material</class>
-		<class>org.apache.olingo.odata2.jpa.processor.ref.model.AppointmentActivity</class>
+		<!-- <class>org.apache.olingo.odata2.jpa.processor.ref.model.AppointmentActivity</class>
 				<class>org.apache.olingo.odata2.jpa.processor.ref.model.Activity</class>
-		<class>org.apache.olingo.odata2.jpa.processor.ref.model.ActivityParty</class>
+		<class>org.apache.olingo.odata2.jpa.processor.ref.model.ActivityParty</class> -->
 		<class>org.apache.olingo.odata2.jpa.processor.ref.converter.BlobToByteConverter</class>
 		<properties>
 			<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/web/JPAReferenceServiceFactory.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/web/JPAReferenceServiceFactory.java b/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/web/JPAReferenceServiceFactory.java
index 256ffdd..60679f8 100644
--- a/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/web/JPAReferenceServiceFactory.java
+++ b/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/web/JPAReferenceServiceFactory.java
@@ -47,7 +47,7 @@ public class JPAReferenceServiceFactory extends ODataJPAServiceFactory {
     oDataJPAContext
         .setJPAEdmExtension((JPAEdmExtension) new SalesOrderProcessingExtension());
     oDataJPAContext.setPageSize(PAGE_SIZE);
-    oDataJPAContext.setDefaultNaming(false);
+    oDataJPAContext.setDefaultNaming(true);
     setErrorLevel();
     setOnWriteJPAContent(onDBWriteContent);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/28e28212/odata2-jpa-processor/jpa-web/src/main/webapp/index.jsp
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-web/src/main/webapp/index.jsp b/odata2-jpa-processor/jpa-web/src/main/webapp/index.jsp
index 0885ad0..c261c16 100644
--- a/odata2-jpa-processor/jpa-web/src/main/webapp/index.jsp
+++ b/odata2-jpa-processor/jpa-web/src/main/webapp/index.jsp
@@ -297,13 +297,13 @@ th,td {
 				<ul>
 					<li><a
 						href="SalesOrderProcessing.svc/SalesOrders?$top=1&$inlinecount=allpages"
-						target="_blank">SalesOrderProcessing.svc/SalesOrders?$top=1&$inlinecount=allpages"</a></li>
+						target="_blank">SalesOrderProcessing.svc/SalesOrders?$top=1&amp;$inlinecount=allpages"</a></li>
 					<li><a
 						href="SalesOrderProcessing.svc/SalesOrders?$top=1&$inlinecount=allpages&$skiptoken=5"
-						target="_blank">SalesOrderProcessing.svc/SalesOrders?$top=1&$inlinecount=allpages&$skiptoken=5</a></li>
+						target="_blank">SalesOrderProcessing.svc/SalesOrders?$top=1&amp;$inlinecount=allpages&amp;$skiptoken=5</a></li>
 					<li><a
 						href="SalesOrderProcessing.svc/SalesOrders?$top=1&$skip=4&$inlinecount=allpages&$skiptoken=5"
-						target="_blank">SalesOrderProcessing.svc/SalesOrders?$top=1&$skip=4&$inlinecount=allpages&$skiptoken=5</a></li>
+						target="_blank">SalesOrderProcessing.svc/SalesOrders?$top=1&amp;$skip=4&amp;$inlinecount=allpages&amp;$skiptoken=5</a></li>
 				</ul>
 			</td>
 			<td valign="top">&nbsp;</td>