【问题标题】:Spring JPA Hibernate valid configuration not working with JdbcTemplate?Spring JPA Hibernate 有效配置不适用于 JdbcTemplate?
【发布时间】:2013-01-28 17:00:47
【问题描述】:

我在 Spring 中确实有一个带有 Hibernate 提供程序的 JPA 工作配置:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="loadTimeWeaver">
        <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<tx:annotation-driven mode="aspectj"/>
<bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"/>

此配置在基于 Spring 的小型 Web 应用程序中运行。

但是,当我将相同的配置插入到其他现有的基于 Spring 的 web 应用程序中时,我确实得到了以下异常:

javax.persistence.TransactionRequiredException:没有正在进行的事务

我认为它与 Spring JDBC 模板有些冲突:

<bean id="mysqlTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource" />
</bean>

我怎样才能让它同时工作?

【问题讨论】:

  • 看看stackoverflow.com/questions/1801828/…这里的答案是否有帮助?
  • 我们发现 JdbcTemplate 不会影响 JPA Hibernate。这可能是由于 Spring ContextLoaderListener 和 DispatcherServlet 配置错误造成的。但是什么?
  • 尝试将 entityManagerFactory 的属性引用放入 jpaTransactionManager 中,例如: 看看是否遗漏了配置

标签: spring hibernate jpa-2.0 entitymanager jdbctemplate


【解决方案1】:

“没有进行中的事务”仅表示您正在尝试在某处使用 EntityManager 并且您没有先启动事务。堆栈跟踪将告诉您确切的位置。由于您使用的是注释驱动的事务,因此只需确保您在异常发生位置的调用链上的某个位置有一个适当的@Transactional

【讨论】:

  • 它在没有 JdbcTemplate 的项目中与 @Transactional 一起使用。它不适用于带有 JdbcTemplate 的项目中的 @Transactional。我确实尝试将@Transactional(propagation=Propagation.XXX) 设置为所有可能的值。每次我遇到同样的异常。
  • 我说合适 @Transactional。最有可能的是,您在为错误的数据源、实体管理器或其他任何东西打开的事务中进行操作。
  • 我在 Tomcat 上下文中创建了一个单独的 JNDI 数据源。每个数据源都有一个单独的事务管理器。 @Transactional 配置了正确的事务管理器,@PersistenceContext 被正确注入。我能够只读数据库,能够自动生成表,我无法在数据库中提交某些内容:entityManager.flush(); 确实一直抛出异常。
猜你喜欢
  • 2015-06-25
  • 2013-04-22
  • 2020-08-06
  • 1970-01-01
  • 2019-04-19
  • 2013-07-29
  • 2020-03-16
  • 1970-01-01
  • 2012-04-14
相关资源
最近更新 更多