持久化数据时获取异常

时间:2013-05-17 13:07:45

标签: spring-mvc annotations spring-transactions

您好,我在保留数据的同时得到了下面提到的异常

18:23:50,385 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/IOCS].[mvc-dispatcher]] (http-localhost-127.0.0.1-8080-2) Servlet.service() for servlet mvc-dispatcher threw exception: javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:970) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_17]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_17]
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) [org.springframework.orm-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at com.sun.proxy.$Proxy26.flush(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_17]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_17]
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) [org.springframework.orm-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at com.sun.proxy.$Proxy26.flush(Unknown Source)
at com.web.iocs.dao.impl.LoginDAOImpl.inserUserDetails(LoginDAOImpl.java:63) [classes:]
at com.web.iocs.bo.impl.LoginBOImpl.insertUserDetails(LoginBOImpl.java:38) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_17]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_17]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) [org.springframework.aop-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196) [org.springframework.aop-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at com.sun.proxy.$Proxy29.insertUserDetails(Unknown Source)
at com.web.iocs.action.LoginAction.login(LoginAction.java:53) [classes:]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_17]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.7.0_17]
at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.7.0_17]
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175) [org.springframework.web-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421) [org.springframework.web.servlet-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409) [org.springframework.web.servlet-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774) [org.springframework.web.servlet-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) [org.springframework.web.servlet-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) [org.springframework.web.servlet-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) [org.springframework.web.servlet-3.0.3.RELEASE.jar:3.0.3.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_17]

我的 mvc-dispatcher-servlet 看起来像这样

<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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
  http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
 http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

<context:annotation-config /> 
<context:component-scan base-package="com.web.iocs" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
     <property name="viewClass">
        <value>org.springframework.web.servlet.view.tiles2.TilesView</value>    
     </property> 
</bean> 

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">     
    <property name="definitions">
        <list>             
            <value>/WEB-INF/tiles.xml</value>         
        </list>     
    </property> 
</bean>



<tx:jta-transaction-manager transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name='entityManagerFactory' ref='entityManagerFactory' />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>

<tx:annotation-driven />

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor">
    <property name="persistenceUnits">
        <map>
            <entry key="OCSPersistenceUnit" value="persistence/OCSPersistenceUnit" />
        </map>
    </property>
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="OCSPersistenceUnit" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false" />
        </bean>
    </property>
</bean>

<bean id="messageSource"  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages" />
    <property name="defaultEncoding" value="UTF-8" />     
</bean>

我的 DAO 文件就是这样的

/**
 * 
 */
package com.web.iocs.dao.impl;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;
import com.web.iocs.dao.LoginDAO;
import com.web.iocs.model.UserDetails;
import com.web.iocs.model.UserModel;


/**
 * @author 
 *
 */
@Repository
public class LoginDAOImpl implements LoginDAO {

private static final Logger LOG = Logger.getLogger(LoginDAOImpl.class);


@PersistenceContext(unitName="OCSPersistenceUnit")
private EntityManager entityManager;



/* (non-Javadoc)
 * @see com.web.iocs.dao.LoginDAO#getUserDetails(com.web.iocs.model.UserModel)
 */
public UserModel getUserDetails(UserModel userModel) {

    /*LOG.info("IN getUserDetails() METHOD");

    //Session session = sessionFactory.getCurrentSession();

    //Session session = HibernateUtil.getSessionFactory().getCurrentSession();

    session.beginTransaction();

    userModel=(UserModel)session.get("from userModel", userModel.getUserName());

    LOG.info(userModel.toString());

    session.getTransaction().commit();

    LOG.info("OUT getUserDetails() METHOD");*/

    return userModel;
}

public int inserUserDetails(UserDetails userDetails) {
    LOG.info("Entity Manager  "+getEntityManager().isOpen());
    getEntityManager().persist(userDetails);
    getEntityManager().flush();
    LOG.info("User details persisted");

    return 1;
}

public EntityManager getEntityManager() {
    return entityManager;
}

public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}
  }

我正在尝试使用spring事务管理来持久保存数据。 在此先感谢

1 个答案:

答案 0 :(得分:1)

尝试在方法@Transactional

上方添加LoginDAOImpl.insertUserDetails(UserDetails userDetails)