2014-08-29 1 views
1

MongoDB에서 Spring, Hibernate-OGM을 사용하려고합니다. 그러나 거래 문제가 있습니다. 나는 그들이 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 :이 방법 eveything은 잘 작동

@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(); 

} 

그러나 나는 다음과 같이 더 단순하게 작업하고 싶습니다.

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

제안 사항이 있으십니까?

+0

하지만 당신이 그것을 알아 낸? 나는 그것이 최신 Hibernate OGM과 잘 작동하도록 고심하고있다. 감사합니다 – Dan

+0

기본적으로 알아낼 수있는 것이 없습니다. MongoDB는 트랜잭션을 지원하지 않습니다. U는 언급 한 것과 같은 방식으로 처리 할 수 ​​있습니다. 표준 술의 경우 트랜잭션 개발시 모든 것을 사용합니다. 그러나 최근에는 mongodb 용 SPRING 프로젝트로 전환했습니다. 정말 좋아합니다. – Dima

+0

글쎄 사실 나는 묻고 나서 곧 알아 냈다. 유일하게 잘못된 것은 Spring 관리 빈에서 @Transactional을 사용하지 않는다는 것입니다. 그리고 예, 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

다음은 지원되지 않더라도 @transactional을 사용하여 제안하는 hibernate의 참고 사항입니다. http://docs.jboss.org/hibernate/ogm/4.0/reference/en-US/html_single/#_transactions – Dima

관련 문제