1

Spring、Hibernate-OGM を MongoDB で使用しようとしています。ただし、トランザクションに問題があります。それらがMongoDBでサポートされていないことはわかっていますが、注釈@transactionalを使用したいので、begin、commitを行う必要はありません。

例外

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);
 }

どんな助けでも大歓迎です。ありがとうございました

4

2 に答える 2

-2

はい、提案があります。ドキュメントを読んでください。;)

「MongoDB はトランザクションをサポートしていません。」

于 2014-08-30T21:13:18.923 に答える