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);
}
어떤 도움을 주시면 감사하겠습니다. 지금까지 내가 조금 더 이동하면
하지만 당신이 그것을 알아 낸? 나는 그것이 최신 Hibernate OGM과 잘 작동하도록 고심하고있다. 감사합니다 – Dan
기본적으로 알아낼 수있는 것이 없습니다. MongoDB는 트랜잭션을 지원하지 않습니다. U는 언급 한 것과 같은 방식으로 처리 할 수 있습니다. 표준 술의 경우 트랜잭션 개발시 모든 것을 사용합니다. 그러나 최근에는 mongodb 용 SPRING 프로젝트로 전환했습니다. 정말 좋아합니다. – Dima
글쎄 사실 나는 묻고 나서 곧 알아 냈다. 유일하게 잘못된 것은 Spring 관리 빈에서 @Transactional을 사용하지 않는다는 것입니다. 그리고 예, MongoDB 자체는 트랜잭션을 지원하지 않지만 여전히 작업 구분을 제안합니다 ([link] (http://docs.jboss.org/hibernate/ogm/5.0/reference/en-US/html_single/#on_flush_and_transactions)). – Dan