java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:47)
at com.wujw.springMVC.dao.MenuDaoImp.save(MenuDaoImp.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy14.save(Unknown Source)
at com.wujw.springMVC.test.Menutset.save(Menutset.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa_test");   
//System.out.println(emf.createEntityManager().getTransaction().notify().....isActive()==true);
emf.createEntityManager().getTransaction().begin();
emf.createEntityManager().persist(m1);
emf.createEntityManager().persist(m2);
emf.createEntityManager().persist(m3);
emf.createEntityManager().persist(m4);
emf.createEntityManager().getTransaction().commit();

解决方案 »

  1.   

    很久以前接触过JPA,现在都忘记了。
      

  2.   

    JPA又流行起来了?顶吧
      

  3.   

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa_test");   
         EntityManager em = emf.createEntityManager()
         em.getTransaction().begin();
         em.persist(m1);
         em.persist(m2);
         em.persist(m3);
         em.persist(m4);
         em.getTransaction().commit();多次调用createEntityManager()会创建多次会话,事务在每次会话中发生。
      

  4.   

    你这里到底用的是 JPA 手工处理事务,还是让 Spring 来处理的?
      

  5.   

    有这样使用事物的吗?管理事物有两种,一种是容器管理,另一种是手工控制。你这样写像是在手工控制事物,但是多次调用创建实体管理器方法,会出现多个不同的上下文引用,因为一个工厂关联一个持久化上下文,如果调用多次,每个引用都不同,所以在persist实体类的时候,并没有在同一个事物中进行,甚至有可能针对当前实体管理器的事物都未开启,所以会报出事务未被激活的异常!!一家之言,仅供参考!~~~~~~
      

  6.   

    这就相当于LZ在用hibernate这么写:sessionFactory.openSession().beginTransaction();
    sessionFactory.openSession().save(m1);
    sessionFactory.openSession().save(m2);
    sessionFactory.openSession().save(m3);
    sessionFactory.openSession().save(m4);
    sessionFactory.openSession().getTransaction().commit();
      

  7.   

    这个是你的原因,创建人对象没有启动,在事务的对象上调用一下begin方法。
    EntityTransaction ts = em.getTransaction();
    ts.begin();