Hi all,
I have been running into an exception lately and can't seem to remedy
the problem. I am getting a
"javax.persistence.TransactionRequiredException: No transaction
currently active" exception. I am using Karaf v2.2.8, ActiveMQ 5.6.0,
OpenJPA 2.1.1, and CXF 2.6.1. I followed the Apache Aries sample blog
application, so there is a datasource registered via blueprint...looks
like this:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
default-activation="lazy">
<cm:property-placeholder persistent-id="edu.unc.mapseq.ds">
<cm:default-properties>
....snip....
</cm:default-properties>
</cm:property-placeholder>
<bean id="mapseq-ds-jta" class="org.postgresql.xa.PGXADataSource">
<property name="user" value="${username}" />
<property name="password" value="${password}" />
<property name="serverName" value="${serverName}" />
<property name="databaseName" value="${databaseName}" />
<property name="portNumber" value="${port}" />
</bean>
<service id="mapseqXADataSource" ref="mapseq-ds-jta"
interface="javax.sql.XADataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/mapseqJTA" />
</service-properties>
</service>
<bean id="mapseq-ds-no-jta" class="org.postgresql.ds.PGPoolingDataSource">
<property name="user" value="${username}" />
<property name="password" value="${password}" />
<property name="serverName" value="${serverName}" />
<property name="databaseName" value="${databaseName}" />
<property name="portNumber" value="${port}" />
<property name="initialConnections" value="${maxIdle}" />
<property name="maxConnections" value="${maxActive}" />
</bean>
<service id="mapseqDataSource" ref="mapseq-ds-no-jta"
interface="javax.sql.DataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/mapseqNoJTA" />
</service-properties>
</service>
</blueprint>
Here is the persistence.xml:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="mapseq" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>aries:services/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mapseqJTA)</jta-data-source>
<non-jta-data-source>aries:services/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/mapseqNoJTA)</non-jta-data-source>
...snip...
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<!-- <property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)" /> -->
<!-- <property name="openjpa.Log" value="DefaultLevel=TRACE, Runtime=TRACE,
Tool=TRACE, SQL=TRACE" /> -->
<property name="openjpa.jdbc.MappingDefaults"
value="ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict" />
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO,
SQL=WARN" />
<property name="openjpa.jdbc.DBDictionary" value="postgres(SearchStringEscape=\,
SupportsXMLColumn=false)" />
<property name="openjpa.DataCache" value="false" />
<property name="openjpa.QueryCache" value="false" />
</properties>
</persistence-unit>
</persistence>
And finally, the blueprint.xml file to register JPA DAO services:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0"
xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0"
default-activation="lazy">
<bean id="accessControlDAOImpl" class="edu.unc.mapseq.dao.jpa.AccessControlDAOImpl"
init-method="init">
<tx:transaction method="*" value="Required" />
<jpa:context property="entityManager" unitname="mapseq" />
</bean>
<service ref="accessControlDAOImpl"
interface="edu.unc.mapseq.dao.AccessControlDAO" />
...snip...
</blueprint>
Here is part of the stacktrace:
Caused by: javax.persistence.TransactionRequiredException: No transaction
currently active
at
org.apache.aries.jpa.container.context.transaction.impl.JTAPersistenceContextRegistry.getCurrentPersistenceContext(JTAPersistenceContextRegistry.java:103)
at
org.apache.aries.jpa.container.context.transaction.impl.JTAEntityManager.getPersistenceContext(JTAEntityManager.java:83)
at
org.apache.aries.jpa.container.context.transaction.impl.JTAEntityManager.persist(JTAEntityManager.java:278)
at edu.unc.mapseq.dao.jpa.BaseDAOImpl.save(BaseDAOImpl.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.6.0_24]
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.6.0_24]
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.6.0_24]
at java.lang.reflect.Method.invoke(Method.java:616)[:1.6.0_24]
at org.apache.aries.proxy.impl.ProxyHandler$1.invoke(ProxyHandler.java:50)
at org.apache.aries.proxy.impl.DefaultWrapper.invoke(DefaultWrapper.java:31)
at org.apache.aries.proxy.impl.ProxyHandler.invoke(ProxyHandler.java:78)
at $Proxy112.save(Unknown Source)
at
edu.unc.mapseq.ws.impl.HTSFSampleServiceImpl.save(HTSFSampleServiceImpl.java:45)[234:mapseq-web-service-htsf-sample:0.0.1.SNAPSHOT]
The exception occurs whenever I try to do anything that is transaction
related (like persisting an entity). I have set the logging in Karaf to
DEBUG and I can't seem to find anything out of the ordinary. Anyone
seen this before??? Suggested solutions? Suggestions for debugging further?
Regards,
Jason