Пытается использовать 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);
}
любая помощь приветствуется. Спасибо
Извините за некро, но ты понял это? Я изо всех сил пытаюсь заставить его работать с новейшим OGM Hibernate. Спасибо – Dan
В принципе ничего не получится выяснить. У MongoDB нет поддержки транзакций. U может делать то же самое, что и упоминалось, для стандартного использования я использую все, что я делаю при разработке транзакций. Однако недавно я переключился на проект SPRING для mongodb, мне это очень нравится. – Dima
Ну, на самом деле я понял это вскоре после запроса. Единственное, что было неправильно, это то, что я не использовал @Transactional в управляемом Spring компоненте. И да, MongoDB сам по себе не поддерживает транзакции, но они все же предлагают разграничить операцию ([link] (http://docs.jboss.org/hibernate/ogm/5.0/reference/en-US/html_single/#on_flush_and_transactions)). – Dan