diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAContext.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAContext.java index 9a57bf345..bcb27fcd0 100644 --- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAContext.java +++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAContext.java @@ -227,4 +227,9 @@ public interface ODataJPAContext { * @return an instance of type {@link org.apache.olingo.odata2.jpa.processor.api.access.JPAPaging} */ public JPAPaging getPaging(); + + /** + * The transaction context + */ + public ODataJPATransaction getODataJpaTransactionContext(); } diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java index 709a048a9..900ea1494 100644 --- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java +++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAServiceFactory.java @@ -81,6 +81,7 @@ public abstract class ODataJPAServiceFactory extends ODataServiceFactory { private ODataContext oDataContext; private boolean setDetailErrors = false; private OnJPAWriteContent onJPAWriteContent = null; + private ODataJPATransaction oDataJPATransaction = null; /** * Creates an OData Service based on the values set in @@ -201,7 +202,34 @@ public T getCallback(final Class responses = new ArrayList(); try { - oDataJPAContext.getEntityManager().getTransaction().begin(); + oDataJPAContext.getODataJpaTransactionContext().begin(); for (ODataRequest request : requests) { oDataJPAContext.setODataContext(getContext()); ODataResponse response = handler.handleRequest(request); if (response.getStatus().getStatusCode() >= HttpStatusCodes.BAD_REQUEST.getStatusCode()) { // Rollback - oDataJPAContext.getEntityManager().getTransaction().rollback(); + oDataJPAContext.getODataJpaTransactionContext().rollback(); List errorResponses = new ArrayList(1); errorResponses.add(response); return BatchResponsePart.responses(errorResponses).changeSet(false).build(); } responses.add(response); } - oDataJPAContext.getEntityManager().getTransaction().commit(); + oDataJPAContext.getODataJpaTransactionContext().commit(); + return BatchResponsePart.responses(responses).changeSet(true).build(); } catch (Exception e) { 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 64bf56cfd..54666a4bb 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 @@ -27,7 +27,6 @@ import java.util.List; import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; import org.apache.olingo.odata2.api.edm.EdmEntitySet; import org.apache.olingo.odata2.api.edm.EdmException; @@ -44,6 +43,7 @@ import org.apache.olingo.odata2.api.uri.info.PostUriInfo; import org.apache.olingo.odata2.api.uri.info.PutMergePatchUriInfo; import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext; +import org.apache.olingo.odata2.jpa.processor.api.ODataJPATransaction; import org.apache.olingo.odata2.jpa.processor.api.access.JPAProcessor; import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException; import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException; @@ -149,10 +149,9 @@ public void delete(final DeleteUriInfo uriInfo) throws ODataJPARuntimeException public void save() { EntityManager em = context.getEntityManager(); - EntityTransaction tx = em.getTransaction(); - + ODataJPATransaction tx = context.getODataJpaTransactionContext(); if (!tx.isActive()) { - em.getTransaction().begin(); + tx.begin(); if (sourceJPAEntity != null) { em.persist(sourceJPAEntity); } @@ -160,7 +159,7 @@ public void save() { em.persist(targetJPAEntity); em.flush(); } - em.getTransaction().commit(); + tx.commit(); } } 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 d926daf3e..f478b00a0 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,7 +26,6 @@ import java.util.Map; import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; import javax.persistence.Query; import org.apache.olingo.odata2.api.commons.InlineCount; @@ -50,6 +49,7 @@ import org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext; import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneContext; import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneEntityListener; +import org.apache.olingo.odata2.jpa.processor.api.ODataJPATransaction; import org.apache.olingo.odata2.jpa.processor.api.access.JPAFunction; import org.apache.olingo.odata2.jpa.processor.api.access.JPAMethodContext; import org.apache.olingo.odata2.jpa.processor.api.access.JPAProcessor; @@ -355,7 +355,7 @@ public Object process(DeleteUriInfo uriParserResultView, final String contentTyp em.remove(selectedObject); em.flush(); if (isLocalTransaction) { - em.getTransaction().commit(); + oDataJPAContext.getODataJpaTransactionContext().commit(); } } catch (Exception e) { @@ -456,7 +456,7 @@ private Object processCreate(final PostUriInfo createView, final InputStream con em.persist(jpaEntity); if (em.contains(jpaEntity)) { if (isLocalTransaction) { - em.getTransaction().commit(); + oDataJPAContext.getODataJpaTransactionContext().commit(); } return jpaEntity; } @@ -507,7 +507,7 @@ private Object processUpdate(PutMergePatchUriInfo updateView, } em.flush(); if (isLocalTransaction) { - em.getTransaction().commit(); + oDataJPAContext.getODataJpaTransactionContext().commit(); } } catch (Exception e) { throw ODataJPARuntimeException.throwException( @@ -572,9 +572,9 @@ private List handlePaging(final Query query, final GetEntitySetUriInfo u } private boolean setTransaction() { - final EntityTransaction transaction = em.getTransaction(); - if (!transaction.isActive()) { - em.getTransaction().begin(); + ODataJPATransaction transactionContext = oDataJPAContext.getODataJpaTransactionContext(); + if (!transactionContext.isActive()) { + transactionContext.begin(); return true; } diff --git a/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/ODataJPATransactionLocalDefault.java b/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/ODataJPATransactionLocalDefault.java new file mode 100644 index 000000000..3ee63b79f --- /dev/null +++ b/odata2-jpa-processor/jpa-web/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/extension/ODataJPATransactionLocalDefault.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ******************************************************************************/ +package org.apache.olingo.odata2.jpa.processor.ref.extension; + + +import org.apache.olingo.odata2.jpa.processor.api.ODataJPATransaction; + +import javax.persistence.EntityManager; +import javax.persistence.EntityTransaction; + +public class ODataJPATransactionLocalDefault implements ODataJPATransaction { + + EntityTransaction tx = null; + + public ODataJPATransactionLocalDefault(EntityManager em) { + this.tx = em.getTransaction(); + } + + @Override + public void begin() { + tx.begin(); + } + + @Override + public void commit() { + tx.commit(); + } + + @Override + public void rollback() { + tx.rollback(); + } + + @Override + public boolean isActive() { + return tx.isActive(); + } +} 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 256ffdd50..1f6873bda 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 @@ -25,6 +25,7 @@ import org.apache.olingo.odata2.jpa.processor.api.OnJPAWriteContent; import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException; import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmExtension; +import org.apache.olingo.odata2.jpa.processor.ref.extension.ODataJPATransactionLocalDefault; import org.apache.olingo.odata2.jpa.processor.ref.extension.OnDBWriteContent; import org.apache.olingo.odata2.jpa.processor.ref.extension.SalesOrderProcessingExtension; import org.apache.olingo.odata2.jpa.processor.ref.factory.JPAEntityManagerFactory; @@ -50,6 +51,11 @@ public ODataJPAContext initializeODataJPAContext() oDataJPAContext.setDefaultNaming(false); setErrorLevel(); setOnWriteJPAContent(onDBWriteContent); + if(getoDataJPATransaction() == null) { + setODataJPATransaction( + new ODataJPATransactionLocalDefault(getODataJPAContext().getEntityManager())); + } + return oDataJPAContext; }