2012-12-20 46 views
2

我們有一個已經使用JPA和guice-persist的現有j2se項目。現在,因爲我們要添加JMS功能,所以需要2階段提交和JTA。我們將使用bitronix事務管理器,因爲沒有容器(如spring)。使用Guice的麻煩與JTA/bitronix一起存在

據我瞭解,我們要做的第一件事就是從RESSOURCE-LOCAL更改事務型持久性單元,以JTA,因爲我們希望數據庫事務投給承諾而不是提交。收集所有選票後,第2階段完成提交。

隨着guice-persist我們使用@Transactional註釋的方法,應該在單個事務中運行。 JPAPersistModule提供了一個EnitiyManagerFactory,它用於guice-persist內部類,如JpaLocalTxnInterceptor包裝註釋的方法。

現在,我得到異常喜歡

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) 
    ... 

因爲JpaLocalTxnInterceptor電話getTransaction()所提供的實體管理器。

我很困難,此刻。有什麼方法可以和JTA一起使用guice-persist嗎?或者我們真的必須放棄項目中的guice-persist?或者,如果我們想要使用JTA(Bitronix),那麼是否有替代品?

回答

2

有類似的情況。在我們的例子中,我們使用了Guice + Jooq。我們需要Jooq,因爲我們有一個很大的傳統Rails數據庫,並且需要精確的控制和速度。我們選擇了Guice而不是Spring,因爲我們認爲它是一個更好的框架,而且速度更快,我們喜歡編譯時間檢查。

我們不能使用吉斯堅持與Jooq,所以我們:

  • 使用JTA Atomikos公司(免費版)
  • 編寫了自己的@Transactional註解的AOP攔截器;
  • 我們的注射服務提供java.sql.Connection中我們jooq處理器,但總是提供一個數據源Atomikos公司豆

我們基本上修改這個代碼:

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

所以這個例子應用常規的JDBC Tx,但是我們對它進行了修改,所以它會使用Atmomikos'JTA aware Tx來代替。

工程就像一個魅力!

Oje

+0

在我的情況下,我們改變了DI框架並現在使用CDI。不是因爲這個問題,而是因爲決定將所有東西移植到J2EE應用程序(JBoss - > CDI)。但是爲JTA寫一個自定義攔截器看起來就像是要走的路。感謝你的回答! –

+0

乾杯!我不能推薦JOOQ足夠的btw ... –

+0

@Oje你可以提供一個存儲庫GIT哪裏有可能瞭解的步驟,pleeeese? :) – Alexian