2017-07-24 66 views
0

我应该在配置中缺少一些,但是阅读了很多帖子并没有发现问题。当我尝试坚持一个实体,我得到这个错误Spring + JPA没有transanction正在进行

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组件) - >道(春季库) - >坚持(EntityManager的)

吾道定义(我测试之前没有@Transactional):

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

吾道方法(我测试之前没有@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依赖:

enter image description here

最后,我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> 
+0

您是否告诉Spring,扫描您的程序包寻找使用@Repository注释的类? – gabrielgiussi

+0

是的,我有组件:扫描,我将更新与全弹簧文件配置 – Genaut

+0

'DaoRegisterImpl'是一个春豆?你如何从ApplciationContext获得它?如果你创建一个类型为'DaoRegisterImpl'的新对象,它将不起作用。 –

回答

0

尝试更改您的配置,如thi s,取自我的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> 
相关问题