2014-08-29 146 views
1

試圖將Spring,Hibernate-OGM與MongoDB結合使用。但是會遇到交易問題。我知道他們不被MongoDB支持,但是我想使用註解@transactional,所以我不必開始,提交。無法使用MongoDB打開JPA EntityManager進行交易

異常

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() 
at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:430) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:420) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) 

DB的context.xml

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="mongo-hibernate"/>  
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

的persistence.xml

<persistence-unit name="mongo-hibernate" transaction-type="JTA"> 
     <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> 

     <properties> 
      <property name="hibernate.current_session_context_class" value="thread"/>       
      <property name="hibernate.ogm.datastore.provider" value="mongodb"/> 
      <property name="hibernate.ogm.datastore.grid_dialect" value="org.hibernate.ogm.datastore.mongodb.MongoDBDialect"/>   
      <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>     
      <property name="hibernate.ogm.datastore.database" value="mongodbtest"/> 
      <property name="hibernate.ogm.mongodb.database" value="mongodbtest"/> 
      <property name="hibernate.ogm.mongodb.host" value="localhost"/> 
      <property name="hibernate.ogm.mongodb.associations.store" value="IN_ENTITY"/> 
     </properties> 

    </persistence-unit> 
</persistence> 

DAO

@PersistenceContext 
protected EntityManager entityManager; 

@Transactional(readOnly = false) 
public <E> void updateObject(E entity) { 
    entityManager.persist(entity); 
} 

任何幫助表示讚賞。謝謝

回答

1

到目前爲止,我搬到遠一點,我改變了一些文件:

DB的context.xml

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="mongo-hibernate"/>  
    </bean> 

    <bean class="com.arjuna.ats.jta.TransactionManager" factory-method="transactionManager" id="arjunaTransactionManager"/> 
    <bean class="com.arjuna.ats.jta.UserTransaction" factory-method="userTransaction" id="arjunaUserTransaction"/> 

    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="arjunaTransactionManager"/> 
    <property name="userTransaction" ref="arjunaUserTransaction"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

DAO:

@PersistenceContext 
protected EntityManager entityManager; 

@Transactional(readOnly = false) 
public <E> void updateObject(E entity) { 

    Session session = entityManager.unwrap(Session.class);   
    org.hibernate.Transaction tx = session.getTransaction(); 
    tx.begin(); 
    session.persist(entity); 
    tx.commit(); 

} 

這樣eveything工作正常,但我真的很喜歡它的工作更簡單:

@Transactional(readOnly = false) 
public <E> void updateObject(E entity) { 
    entityManager.persist(entity); 
} 

有什麼建議嗎?

+0

對不起,死靈但你想通了?我正努力讓它與最新的Hibernate OGM一起工作。謝謝 – Dan 2016-08-25 11:33:06

+0

基本上沒有什麼可以弄清楚的。 MongoDB沒有交易支持。 U可以像上面提到的那樣做,爲了標準的緣故,我在開發事務時使用我所做的一切。但是最近我轉到了mongodb的SPRING項目,到目前爲止我非常喜歡它。 – Dima 2016-08-26 13:24:21

+0

實際上,我問到後不久就想出來了。唯一錯誤的是我沒有在Spring管理bean中使用@Transactional。是的,MongoDB本身不支持交易,但他們仍然建議劃分操作([鏈接](http://docs.jboss.org/hibernate/ogm/5.0/reference/en-US/html_single/#on_flush_and_transactions))。 – Dan 2016-08-26 14:11:37

-2

是的,我有一個建議:閱讀文檔。 ;)

"MongoDB does not support transaction."

+0

我閱讀文檔,我知道交易不受支持,但休眠人仍然建議使用標準語法@Transactional。 – Dima 2014-08-31 14:44:41

+0

這是從hibernate建議使用@transactional的說明,即使它們不支持http://docs.jboss.org/hibernate/ogm/4.0/reference/en-US/html_single/#_transactions – Dima 2014-08-31 23:42:30

相關問題