Domanda

We have an existing j2se project that already uses JPA and guice-persist. Now, because we want to add JMS functionality, there is a request for 2-phase-commit and JTA. We'll use the bitronix transaction manager because there's no container (like spring).

To my understanding, the first thing we have to do is to change the transaction-type of the persistence unit from RESSOURCE-LOCAL to JTA, because we want database transactions to vote for commit rather then commit. The commit is done on phase 2 after collecting all votes.

With guice-persist we use the @Transactional annotation for methods that should run in a single transaction. The JPAPersistModule provides an EnitiyManagerFactory and it is used for guice-persist internal classes, like JpaLocalTxnInterceptor that wraps the annotated methods.

Now I get exceptions like

java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
at org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:1009)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:57)
    ...

because the JpaLocalTxnInterceptor calls getTransaction() on the provided entity manager.

I'm quite stuck, at the moment. Is there any way to use guice-persist together with JTA or o we really have to drop guice-persist from the project? Or, is there any replacement for guice-persist if we want to do JTA (with Bitronix)?

È stato utile?

Soluzione

Had a similar situation. In our case we were using Guice + Jooq. We wanted Jooq because we have a large legacy Rails DB and wanted fine control plus speed. We picked Guice over Spring because we felt it is a better framework, and it is much faster and we like compile time checking.

We could NOT use Guice persist with Jooq, so we :

  • Use Atomikos JTA (free version)
  • Wrote our own @Transactional AOP annotation interceptor;
  • Our injectable Service provides the java.sql.Connection to our jooq processors, but always supply an Atomikos DataSource bean

We basically modified this code:

http://www.dailyjavatips.com/2011/10/24/database-transactions-google-guice-aop/

So that example uses regular JDBC Tx, but we modified it so it would use Atmomikos' JTA aware Tx instead.

Works like a charm!

Oje

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top