【问题标题】:Spring + JPA No transanction is in progressSpring + JPA 没有正在进行的事务
【发布时间】:2017-12-30 03:59:47
【问题描述】:

我应该在配置中遗漏了一些,但是阅读了很多帖子并没有发现问题。当我尝试持久化一个实体时,我收到了这个错误

javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3461)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1425)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1421)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
    at com.sun.proxy.$Proxy36.flush(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
    at com.sun.proxy.$Proxy31.flush(Unknown Source)
    at com.myproject.core.dao.impl.DaoBaseImpl.persist(DaoBaseImpl.java:54)
    at com.myproject.web.register.dao.impl.DaoRegisterImpl.addUser(DaoRegisterImpl.java:69)
    at com.myproject.web.register.service.impl.ServiceRegisterImpl.addUser(ServiceRegisterImpl.java:51)
    at com.myproject.web.register.controller.impl.ControllerRegisterImpl.registerUser(ControllerRegisterImpl.java:60)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

我的请求遵循以下路径: 控制器(Spring MVC)-> 服务(Spring 组件)-> Dao(Spring 存储库)-> 持久化(EntityManager)

我的 Dao 定义(我之前在没有 @Transactional 的情况下测试过):

@Repository("DaoRegister")
@Transactional
public class DaoRegisterImpl extends DaoBaseImpl<EntityUser> implements DaoRegister {

我的 Dao 方法(我之前在没有 @Transactional 的情况下测试过):

@Override
    @Transactional
    public void addUser(EntityUser user) {
        try {
            persist(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我的 servlet-context.xml 中有这个持久性配置:

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

    <!-- DispatcherServlet Context: defines this servlet's request-processing 
        infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
    <annotation-driven />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving 
        up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
        in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <context:component-scan base-package="com.myproject" />

    <!-- Propiedades -->
    <context:property-placeholder location="classpath:ehconf/*.properties" />

    <!-- Gestión de persistencia -->
    <beans:bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <beans:property name="loadTimeWeaver">
            <beans:bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
        </beans:property>
    </beans:bean>

    <beans:bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
        <beans:property name="entityManagerFactory" ref="myEmf" />
    </beans:bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

</beans:beans>

这是我的 Maven 依赖项:

最后,我的persistence.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">

  <persistence-unit name="myproject" transaction-type="RESOURCE_LOCAL">  
    <!--  Indicamos que nuestro proveedor de persistencia es Hibernate -->
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>

    <!-- Propiedades -->
    <properties>
            <!-- Propiedades de JPA -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>

            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/ehdatabase?serverTimezone=UTC"/>
            <property name="javax.persistence.jdbc.user" value="ehdatabase"/>
            <property name="javax.persistence.jdbc.password" value="ehdatabase123"/>
            <property name="javax.persistence.query.timeout" value="1000"/>

            <!--Hibernate properties-->
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>

    </properties>

    <class>com.myproject.web.users.entity.EntityUser</class>

  </persistence-unit>
</persistence>

【问题讨论】:

  • 你是在告诉 Spring 扫描你的包以查找带有 @Repository 注释的类吗?
  • 是的,我有组件:扫描,我将使用完整的 spring 文件配置进行更新
  • DaoRegisterImpl 是 Spring bean 吗?您如何从ApplciationContext 获得它?如果你创建一个DaoRegisterImpl 类型的新对象,它将不起作用。

标签: java spring hibernate spring-mvc jpa


【解决方案1】:

尝试像这样更改您的配置,取自我的 spring+JPA 项目:

<!-- Bound entity manager with Spring Transaction -->
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emFactory" />
</bean>

<!-- Enable annotation for transaction manager -->
<tx:annotation-driven transaction-manager="txManager" />

<!-- Enable Spring data -->
<jpa:repositories transaction-manager-ref="txManager"
    base-package="your.repository.package" entity-manager-factory-ref="emFactory" />

<!-- JPA Entity Manager Factory definition -->
<!-- Use hibernate as JPA Implementation -->
<bean id="emFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
        <list>
            <value>your.model.package</value>
        </list>
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">change_your_DB_Dialect</prop>
            <prop key="show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
        </props>
    </property>
</bean>

【讨论】:

    猜你喜欢
    • 2015-05-11
    • 2016-03-26
    • 2015-05-04
    • 2010-12-20
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多