[ARIES-1524] Allow the EntityManagerFactoryBuilder to override the persistence unit's transaction type
git-svn-id: https://svn.apache.org/repos/asf/aries/trunk/jpa@1738185 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
index 440913f..ba2b622 100644
--- a/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
+++ b/itests/jpa-container-itest/src/test/java/org/apache/aries/jpa/container/itest/JPAContainerTest.java
@@ -15,6 +15,8 @@
*/
package org.apache.aries.jpa.container.itest;
+import static javax.persistence.spi.PersistenceUnitTransactionType.JTA;
+import static javax.persistence.spi.PersistenceUnitTransactionType.RESOURCE_LOCAL;
import static org.junit.Assert.assertEquals;
import static org.osgi.service.jdbc.DataSourceFactory.OSGI_JDBC_DRIVER_CLASS;
@@ -28,6 +30,7 @@
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
+import javax.sql.DataSource;
import org.apache.aries.jpa.container.itest.entities.Car;
import org.apache.aries.jpa.itest.AbstractCarJPAITest;
@@ -156,8 +159,34 @@
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.nonJtaDataSource", dsf.createDataSource(jdbcProps));
+ props.put("javax.persistence.transactionType", RESOURCE_LOCAL.name());
EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
carLifecycleRL(emf.createEntityManager());
}
+
+ @Test
+ public void testCarEMFBuilderExternalDSXA() throws Exception {
+ DataSource ds = getService(DataSource.class,
+ "(" + OSGI_JDBC_DRIVER_CLASS + "=org.apache.derby.jdbc.EmbeddedDriver-pool-xa)");
+
+ EntityManagerFactoryBuilder emfBuilder = getService(EntityManagerFactoryBuilder.class,
+ "(osgi.unit.name=" + EXTERNAL_TEST_UNIT + ")");
+
+
+ Map<String, Object> props = new HashMap<String, Object>();
+ props.put("javax.persistence.jtaDataSource", ds);
+ props.put("javax.persistence.transactionType", JTA.name());
+
+ //EclipseLink also needs a non-jta-datasource
+ DataSourceFactory dsf = getService(DataSourceFactory.class,
+ "(" + OSGI_JDBC_DRIVER_CLASS + "=org.apache.derby.jdbc.EmbeddedDriver)");
+ Properties jdbcProps = new Properties();
+ jdbcProps.setProperty("url", "jdbc:derby:memory:TEST1;create=true");
+ props.put("javax.persistence.nonJtaDataSource", dsf.createDataSource(jdbcProps));
+
+
+ EntityManagerFactory emf = emfBuilder.createEntityManagerFactory(props);
+ carLifecycleXA(ut, emf.createEntityManager());
+ }
}
diff --git a/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml b/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
index 839750d..dd96ff2 100644
--- a/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
+++ b/itests/jpa-container-testbundle/src/main/resources/META-INF/persistence.xml
@@ -87,7 +87,7 @@
</properties>
</persistence-unit>
- <persistence-unit name="external-test-unit" transaction-type="RESOURCE_LOCAL">
+ <persistence-unit name="external-test-unit">
<description>Test persistence unit for the JPA Container External DataSource iTests</description>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java
index 71b4dd4..e224acd 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/AriesEntityManagerFactoryBuilder.java
@@ -23,6 +23,7 @@
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
+import javax.persistence.spi.PersistenceUnitTransactionType;
import javax.sql.DataSource;
import org.apache.aries.jpa.container.parser.impl.PersistenceUnit;
@@ -37,6 +38,7 @@
private static final String JAVAX_PERSISTENCE_JDBC_DRIVER = "javax.persistence.jdbc.driver";
private static final String JAVAX_PERSISTENCE_JTA_DATASOURCE = "javax.persistence.jtaDataSource";
private static final String JAVAX_PERSISTENCE_NON_JTA_DATASOURCE = "javax.persistence.nonJtaDataSource";
+ private static final String JAVAX_PERSISTENCE_TX_TYPE = "javax.persistence.transactionType";
private PersistenceProvider provider;
private PersistenceUnit persistenceUnit;
@@ -75,6 +77,14 @@
props.remove(JAVAX_PERSISTENCE_NON_JTA_DATASOURCE);
}
+ o = props.get(JAVAX_PERSISTENCE_TX_TYPE);
+ if(o instanceof PersistenceUnitTransactionType) {
+ persistenceUnit.setTransactionType((PersistenceUnitTransactionType) o);
+ } else if (o instanceof String) {
+ persistenceUnit.setTransactionType(
+ PersistenceUnitTransactionType.valueOf((String) o));
+ }
+
return provider.createContainerEntityManagerFactory(persistenceUnit, props);
}
diff --git a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
index f5f767a..34e7911 100644
--- a/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
+++ b/jpa-container/src/main/java/org/apache/aries/jpa/container/parser/impl/PersistenceUnit.java
@@ -221,4 +221,8 @@
}
}
}
+
+ public void setTransactionType(PersistenceUnitTransactionType transactionType) {
+ this.transactionType = transactionType;
+ }
}