2014-08-29 3 views
1

Пытается использовать Spring, Hibernate-OGM с MongoDB. Однако проблема с транзакциями. Я знаю, что они не поддерживаются MongoDB, но я хочу использовать аннотацию @transactional, поэтому мне не нужно начинать, совершать.Не удалось открыть JPA EntityManager для транзакции с использованием MongoDB

Исключение

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> 

ДАО

@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

Извините за некро, но ты понял это? Я изо всех сил пытаюсь заставить его работать с новейшим OGM Hibernate. Спасибо – Dan

+0

В принципе ничего не получится выяснить. У MongoDB нет поддержки транзакций. U может делать то же самое, что и упоминалось, для стандартного использования я использую все, что я делаю при разработке транзакций. Однако недавно я переключился на проект SPRING для mongodb, мне это очень нравится. – Dima

+0

Ну, на самом деле я понял это вскоре после запроса. Единственное, что было неправильно, это то, что я не использовал @Transactional в управляемом Spring компоненте. И да, MongoDB сам по себе не поддерживает транзакции, но они все же предлагают разграничить операцию ([link] (http://docs.jboss.org/hibernate/ogm/5.0/reference/en-US/html_single/#on_flush_and_transactions)). – Dan

-2

У меня есть предложение: прочитайте документы. ;)

"MongoDB does not support transaction."

+0

Я читал документы, я знаю, что транзакции не поддерживаются, однако спящие ребята все же советуют использовать стандартный синтаксис @Transactional. – Dima

+0

Вот записка из hibernate, предлагающая использовать @transactional, даже если они не поддерживаются. Http://docs.jboss.org/hibernate/ogm/4.0/reference/en-US/html_single/#_transactions – Dima

Смежные вопросы

 Смежные вопросы