Нет EntityManager с фактической транзакцией, доступной для текущего потока - невозможно надежно обработать вызов «flush»JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Нет EntityManager с фактической транзакцией, доступной для текущего потока - невозможно надежно обработать вызов «flush»

Сообщение Anonymous »

Некоторая справочная информация: я пытаюсь перенести большой проект с Hibernate 3.6.8 на 5.2.5 (включая обновление JPA с 2.0 до 2.1), Spring 3.2.3 на 4.3.5, и столкнулся с серьезными проблемами. Конфигурация для Spring и Hibernate пока не менялась и на старых версиях работала нормально, однако при обновлении возникли проблемы, которые я не могу решить самостоятельно.


Исключение, которое я получаю:

Код: Выделить всё

2017-01-16 10:15:25,635 ERROR [[ACTIVE] ExecuteThread: '15' for queue: 'weblogic.kernel.Default (self-tuning)'] org.myproject.common.messaging.BaseMDB: Code: (11702) Source: (Common) Exception caught - Exception org.springframework.dao.InvalidDataAccessApiUsageException in org.myproject.core.processing.message.MessageReceiverImpl caught
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'flush' call;  nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'flush' call
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:413)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:246)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:491)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy187.flushAndClear(Unknown Source)
at org.myproject.core.BasePersistenceMDB.synchronizeBackend(BasePersistenceMDB.java:46)
at org.myproject.core.BasePersistenceMDB.onTextMessage(BasePersistenceMDB.java:32)
at org.myproject.common.messaging.BaseMDB.evaluateJMSMessage(BaseMDB.java:100)
at org.myproject.common.messaging.BaseMDB.onMessage(BaseMDB.java:51)
at sun.reflect.GeneratedMethodAccessor591.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.bea.core.repackaged.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at com.oracle.pitchfork.intercept.MethodInvocationInvocationContext.proceed(MethodInvocationInvocationContext.java:100)
at com.oracle.pitchfork.intercept.JeeInterceptorInterceptor.invoke(JeeInterceptorInterceptor.java:117)
at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
at com.bea.core.repackaged.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
at com.bea.core.repackaged.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at com.bea.core.repackaged.springframework.aop.framework.JdkDynamicAopProxy.invoke(Unknown Source)
at com.sun.proxy.$Proxy121.onMessage(Unknown Source)
at weblogic.ejb.container.internal.MDListener.execute(MDListener.java:451)
at weblogic.ejb.container.internal.MDListener.transactionalOnMessage(MDListener.java:375)
at weblogic.ejb.container.internal.TokenBasedJMSMessagePoller.processOneMessage(TokenBasedJMSMessagePoller.java:279)
at weblogic.ejb.container.internal.TokenBasedJMSMessagePoller.run(TokenBasedJMSMessagePoller.java:121)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:548)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
Caused by: javax.persistence.TransactionRequiredException:  No EntityManager with actual transaction available for current thread - cannot reliably process 'flush' call
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282)
at com.sun.proxy.$Proxy163.flush(Unknown Source)
at org.myproject.core.data.dao.impl.MyPersistenceContextImpl.flushAndClear(MyPersistenceContextImpl.java:49)
at sun.reflect.GeneratedMethodAccessor616.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
...  28 more
Моя конфигурация выглядит следующим образом:
pom.xml (соответствующие фрагменты):

для Spring:

Код: Выделить всё

org.springframework
spring-context
4.3.5.RELEASE


org.springframework
spring-context-support
4.3.5.RELEASE


org.springframework
spring-core
4.3.5.RELEASE


org.springframework
spring-jdbc
4.3.5.RELEASE


org.springframework
spring-orm
4.3.5.RELEASE


org.springframework
spring-tx
4.3.5.RELEASE


org.springframework
spring-web
4.3.5.RELEASE


org.springframework
spring-webmvc
4.3.5.RELEASE


org.springframework
spring-test
4.3.5.RELEASE
test

для спящего режима:

Код: Выделить всё

org.hibernate.common
hibernate-commons-annotations
5.0.1.Final


org.hibernate
hibernate-core
5.2.6.Final


org.hibernate
hibernate-entitymanager
5.2.6.Final


org.hibernate.javax.persistence
hibernate-jpa-2.1-api
1.0.0.Final


org.hibernate
hibernate-jpamodelgen
5.2.6.Final
provided

persistence.xml (full): (здесь некоторые вещи были изменены, но не помогло: добавлен jta-data-source , версии xsd обновлены)

Код: Выделить всё

             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">


org.hibernate.jpa.HibernatePersistenceProvider
myproject-ds_jndi

META-INF/named-queries.xml

org.myproj.core.domain.Message




appContext.xml (соответствующие фрагменты): (только что добавлено одно дополнительное свойство в jpaProperties после обновления)

Код: Выделить всё



...








classpath:configuration.properties
classpath:externalized-queries.properties























${transactionManagerLookupClass}
org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform 









...
Соответствующие фрагменты из класса, открывающего транзакцию, демонстрирующие, какие аннотации здесь использовались:

Код: Выделить всё

import java.sql.SQLException;
import java.util.Set;

import javax.interceptor.Interceptors;

import org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

...

@Interceptors(SpringBeanAutowiringInterceptor.class)
@Transactional(propagation = Propagation.REQUIRED)
public class DBLockingImpl implements Locking {

@Autowired
private DataSource dataSource;
Это класс, вызывающийentityManager (транзакция уже открыта на этом этапе, но исключение возникает, когда здесь вызывается метод сброса в EntityManager). ):

Код: Выделить всё

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository(value = "persistenceContext")
public class PersistenceContextImpl
implements PersistenceContext {

/**
* Instance variable for EntityManager.
*/
@PersistenceContext
private EntityManager entityManager;

@Override
public void flushAndClear() {
entityManager.flush();
entityManager.clear();
}
}
Может ли кто-нибудь помочь мне с этой проблемой? Я не понимаю, чего не хватает и почему я получаю это исключение. У меня складывается впечатление, что Spring неправильно подключается к диспетчеру объектов Hibernates, и поэтому возникает исключение, поскольку сама транзакция вроде бы создается, но всякий раз, когда он пытается сохранить это исключение, вылетает. В конце концов, мне кажется странным, что он больше не работает, хотя со старыми версиями этих фреймворков он работал нормально. Были ли какие-либо большие изменения в конфигурации по сравнению со старыми версиями?

Подробнее здесь: https://stackoverflow.com/questions/417 ... d-cannot-r
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»