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

Reply via email to