没有可用于当前线程的实际事务的 EntityManager - 无法可靠地处理“刷新”调用

2024-04-21

一些背景信息:我正在尝试将一个大项目从 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(相关片段): 对于春季:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.5.RELEASE</version>
  </dependency>
   <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.5.RELEASE</version>
    <scope>test</scope>
  </dependency>

对于休眠:

<dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>5.0.1.Final</version>
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
       <version>5.2.6.Final</version>
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.6.Final</version>
      </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.0.Final</version>
      </dependency>
      <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-jpamodelgen</artifactId>
        <version>5.2.6.Final</version>
        <scope>provided</scope>
      </dependency>

persistence.xml(完整):(这里有些事情已经改变,但没有帮助:jta-data-source已添加,xsd版本已更新)

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             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">

    <persistence-unit name="MYPROJECT_PU" transaction-type="JTA">        
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>myproject-ds_jndi</jta-data-source>

        <mapping-file>META-INF/named-queries.xml</mapping-file>

        <class>org.myproj.core.domain.Message</class>

    </persistence-unit>

</persistence>

appContext.xml(相关片段):(自升级以来,仅在 jpaProperties 中添加了一项额外属性)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/jdbc
    http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">

...

<bean
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:configuration.properties</value>
                <value>classpath:externalized-queries.properties</value>
            </list>
        </property>
    </bean>

    <bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="${datasourceJndiName}"></property>
    </bean>

    <!-- Indicates a JpaVendorAdapter implementation for Hibernate EntityManager. -->
    <bean id="jpaVendorAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="database" value="${databaseVendor}" />
        <property name="showSql" value="${showSql}" />
        <property name="generateDdl" value="${generateDdl}" />
        <property name="databasePlatform" value="${databaseDialect}" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceXmlLocation" value="${persistenceXmlFileLocation}" />
        <property name="persistenceUnitName" value="${persistenceUnitName}" />
        <property name="dataSource" ref="jndiDataSource" />
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.transaction.manager_lookup_class">${transactionManagerLookupClass}</prop>
                <prop key="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform</prop> <!-- this was newly added -->

            </props>
        </property>
    </bean>

    <tx:annotation-driven />

    <tx:jta-transaction-manager />

...

打开事务的类的相关片段演示了此处使用了哪些注释:

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上调用flush方法时发生异常):

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 实体管理器,这就是异常出现的原因,因为 trasanction 本身似乎是创建的,但每当它尝试持久化时,这个异常就会发生。毕竟,我觉得很奇怪,它不再工作了,尽管它在这些框架的旧版本上工作得很好。与旧版本相比,配置有什么大的变化吗?


我怀疑这可能是您的组件扫描或包扫描的问题。我在你的spring配置文件中找不到包扫描代码。请检查或更新您的配置文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有可用于当前线程的实际事务的 EntityManager - 无法可靠地处理“刷新”调用 的相关文章

随机推荐

  • 使用 jQuery 查找文本字符串?

    假设某个网页有一个字符串 例如我想查找 我是一个简单的字符串 我将如何使用 JQuery 来解决这个问题 jQuery 有 contains 方法 这是给您的一个片段 上面的选择器选择包含目标字符串的任何元素 Foundin 将是一个包含任
  • ASP.NET MVC Razor 渲染额外空白

    在 Asp net MVC 中 Razor 在文本块之间插入额外的空格 我想以这种方式呈现一个列表 1 2 3 但得到 1 2 3 for int i 1 i lt 3 i
  • 替换字符串中的多个字符 (XSLT)

    我需要能够替换某些字符 以便我可以将它们用作 CSS 类 我有诸如类 名称 类名之类的字符串 这些字符串不是有效的 CSS 类 据我所知 如何使用替换功能来替换多个字符 E g translate className would repla
  • 如何在谷歌同意屏幕中添加徽标?

    我已经在谷歌开发者控制台中创建了项目 现在我想在同意屏幕中设置我的徽标 我的计算机上有徽标 同意屏幕上的徽标字段需要 URL 有什么方法可以在我的计算机上的同意屏幕上设置徽标吗 我还尝试在谷歌驱动器上上传图像并将其共享链接放在徽标字段中 您
  • 使用 dom4j DOMDocument 提供 validator.validate(DOMSource) 在 java 1.6 中失败(不允许 xsi:noNamespaceSchemaLocation),在 1.5 中有效

    使用 dom4j DOMDocument 提供 validator validate DOMSource 在 java 1 6 中失败 不允许 xsi noNamespaceSchemaLocation 出现在根元素中 在 1 5 中有效
  • “驱动程序未定义”Python/Selenium

    我想在 Python 上使用 Selenium 但有一条警告消息 driver webdriver Chrome D Selenium Chrome chromedriver exe NameError 名称 driver 未定义 我已经安
  • 更改 Hibernate 继承中的子类型

    我想在 Play Framework 中使用 Hibernate 建模三个类 Entity Inheritance strategy InheritanceType JOINED public class SupplyArea extend
  • 使用 TSQL 解压缩值

    如何解压缩存储过程中的 varbinary max 值 我想在 TSQL 代码中实现或调用gunzip 算法 最好不启用 CLR 调查 sp OACreatehttp msdn microsoft com en us library ms1
  • React 无法读取未定义的属性映射

    我对反应很陌生 我正在尝试从 Rails api 引入数据 但我收到了错误TypeError Cannot read property map of undefined 如果我使用反应开发工具 我可以看到状态 如果我在控制台中使用它 我可以
  • MVC 1 和 IIS 7 错误代码 4011

    我有一个在 IIS 7 5 上运行的 MVC 1 应用程序 一些操作完成后 我得到了一个使用 System Web Routing RouteValueDictionary 作为第二个参数的 RedirectToRoute 调用 基本上 它
  • 从数据帧中分层随机抽样

    我有一个格式为的数据框 head subset ants 0 1 1 0 1 age 1 2 2 1 3 lc 1 1 0 1 0 我需要根据年龄和 lc 创建带有随机样本的新数据框 例如 我想要来自age 1和lc 1的30个样本 来自a
  • Python2 和 Python3 使用带有查找和索引的映射时的区别

    给定一个模式和一个字符串str 求如果str遵循相同的模式 这里的 follow 表示完全匹配 这样在pattern中的字母和pattern中的非空单词之间存在双射str 例子 pattern abba str dog cat cat do
  • React-Redux 应用程序中的 OpenID Connect SSO

    我正在尝试使用 OpenID Connect 提供程序在我的 React Redux 应用程序上实现 SSO 目的是保护所有组件 并在会话结束时将用户重定向到身份提供者的登录页面 这就是为什么我不能在应用程序中拥有专用的登录页面 组件 我读
  • 使用平均值填充 pandas 数据框中的缺失值

    datetime 2012 01 01 125 5010 2012 01 02 NaN 2012 01 03 125 5010 2013 01 04 NaN 2013 01 05 125 5010 2013 02 28 125 5010 2
  • 蓝牙串行插件不适用于 ionic

    我正在尝试将蓝牙集成到我的离子应用程序中 以便它可以从蓝牙设备接收数据 我尝试使用蓝牙插件 但在 PC 和 Android 设备上都出现了一堆错误 我已经使用以下命令安装了蓝牙串行 cordova 插件添加 com megster cord
  • typedef 如何用于函数指针

    我想我可能患有可怕的 意外程序员 病 至少在 typedef 和函数指针方面是这样 因此 我一直在尝试涉及这些的各种组合 以根据我得到的所有输出来分析结果 但当我不断尝试不同的组合时 我现在没有分析结果 而是迷失在过程中 我希望你们能帮我解
  • 如何 clickElement() 并在同一选项卡中打开链接,而不是在新窗口中?

    我的网页中有以下 html 元素 a target self href View Data Set a 我在 Rselenium 中使用以下命令来查找该标签 webElem lt remDr findElement using xpath
  • 禁用 Thread.sleep()

    我想禁用在 java 项目中使用 Thread sleep 的可能性 并使用我自己的方法 sleep int time String info 这将等待给定的时间 并打印信息为什么需要在这里等待 正在禁用Thread sleep 可能的 如
  • QueryBuilder/Doctrine 选择加入 groupby

    所以最近我一直在思考 但还找不到这个问题的解决方案 因为我缺乏对doctrine2和symfony查询生成器的开发 我有 2 张桌子 目标 id user id target value 储蓄 id goal id 金额 我需要从目标中进行
  • 没有可用于当前线程的实际事务的 EntityManager - 无法可靠地处理“刷新”调用

    一些背景信息 我正在尝试将一个大项目从 Hibernate 3 6 8 迁移到 5 2 5 包括 JPA 升级 2 0 到 2 1 Spring 3 2 3 到 4 3 5 并且面临严重的问题 到目前为止 Spring 和 Hibernat