代码之家  ›  专栏  ›  技术社区  ›  Michael

StaleObjectStateException错误

  •  3
  • Michael  · 技术社区  · 16 年前

    有人能告诉我错误吗?

    注意:这是从我的真实应用程序中提取的简化测试用例。 em1.getTransaction().begin(); 在每一节的末尾。 在实际应用中,它发生在不同的时间。

            HibernateUtil.open();
    
            EntityManager em1 = HibernateUtil.reserveEntityManager();
            em1.getTransaction().begin();
            StringType st1 = new StringType();
            st1.setName("a");
            em1.persist(st1);
            em1.getTransaction().commit();
            em1.getTransaction().begin();
            em1.clear();
            em1.close();
    
            EntityManager em2 = HibernateUtil.reserveEntityManager();
            em2.getTransaction().begin();
            StringType st2 = new StringType();
            st2.setName("a");
            st2.setId(st1.getId());
            em2.merge(st2);
            em2.getTransaction().commit();
            em2.getTransaction().begin();
            em2.clear();
            em2.close();
    
            EntityManager em3 = HibernateUtil.reserveEntityManager();
            em3.getTransaction().begin();
            StringType st3 = new StringType();
            st3.setName("a");
            st3.setId(st1.getId());
            [b]em3.merge(st3);[/b]
            em3.getTransaction().commit();
            em3.getTransaction().begin();
            em3.clear();
            em3.close();
    
    
    
    public static EntityManager reserveEntityManager()
        {
            return emf.createEntityManager();
        }
    
    public static void open()
        {
            try
            {           
                emf = Persistence.createEntityManagerFactory("manager1");
            }
            catch (Throwable e)
            {
                throw new ExceptionInInitializerError(e);
            }
        }
    

    在org.hibernate.ejb文章摘要actEntityManagerImpl.wrapStaleStateException异常(摘要)java:646) 在org.hibernate.ejb文章摘要actEntityManagerImpl.throwPersistenceException异常(摘要)java:600) 在WebOrganizer.web.servlets.类型Servlet.test2(TypeServlet.java:356) 在sun.reflect.NativeMethodAccessorImpl附件.invoke(本地)veMethodAccessorImpl.java:39个) 在sun.reflect.DelegatingMethodAccessorImpl附件.invoke(委派)ngMethodAccessorImpl.java:25个) 在java.lang.reflect文件.方法.invoke(方法.java:597) 在org.testng.internal内部.MethodHelper.invokeMethod方法(java:580) 在org.testng.internal内部.Invoker.invokeMethod方法(java:517) 在org.testng.internal内部.Invoker.invokeTestMethod(Invoker.java:669) 在org.testng.internal内部.Invoker.invokeTestMethods方法(java:956) 在org.testng.internal内部.TestMethodWorker.invokeTestMethods方法(TestMethodWorker.java:126) 在org.testng.internal内部.TestMethodWorker.run运行(TestMethodWorker.java:110) 在org.testng.TestRunnerprivateRun先生(TestRunner.java:590) 在org.testng.TestRunner.运行(TestRunner.java:484) 在org.testng.SuiteRunner公司.按顺序运行(SuiteRunner.java:327) 在org.testng.SuiteRunner公司.运行(SuiteRunner.java:204) 在org.testng.testng.createAndRunSuiteRunners(TestNG.java:864) 在org.testng.testng.运行(TestNG.java:748) 在org.testng.remote远程.远程测试运行(RemoteTestNG.java:第73页) 在org.testng.remote远程.远程测试.main(RemoteTestNG.java:124) 在sun.reflect.NativeMethodAccessorImpl附件.invoke0(本机方法) 在sun.reflect.NativeMethodAccessorImpl附件.invoke(本地)veMethodAccessorImpl.java:39个) 在sun.reflect.DelegatingMethodAccessorImpl附件.invoke(委派)ngMethodAccessorImpl.java:25个) 在com.intellij.rt公司.执行.application.AppMain.主要(AppMain.java:90)

    原因:org.hibernate.StaleObjectStateException异常:行被另一个事务更新或删除(或未保存的值映射不正确):[WebOrganizer.classes.types文件.字符串类型#174] 在org.hibernate.event事件.def.DefaultMergeEventListener文件.entityIsDetached(定义)ltMergeEventListener.java:261) 在org.hibernate.event事件.def.DefaultMergeEventListener文件onMerge先生(德福)ltMergeEventListener.java:120) 在org.hibernate.event事件.def.DefaultMergeEventListener文件onMerge先生(德福)ltMergeEventListener.java:53) 在组织:hibernate.impl.SessionImpl.fireMerge会话(SessionImpl.java:677) 在组织:hibernate.impl.SessionImpl.merge(SessionImpl.java:661) 在组织:hibernate.impl.SessionImpl.merge(SessionImpl.java:665) ... 28个以上

    2 回复  |  直到 12 年前
        1
  •  1
  •   cliff.meyers    16 年前

    EntityTransaction tx1 = em1.getTransaction();
    // make your modifications
    em1.merge(st1);
    tx1.commit();
    

    在清理EntityManager之前,不确定为什么要开始事务。我不以编程方式处理JPA事务,所以这只是一个有根据的猜测。另外,如果EntityManager每次返回相同的实例,为什么还要创建一个新的EntityManager?

        2
  •  0
  •   ssedano    13 年前

    为什么要保存对象的中间状态?如果必须的话,试试另一种方法。传递标识符,确保在 get flush 刚好在…之后。