Java StaleObjectStateException错误
谁能告诉我这个错误 注意:这是从我的真实应用程序中提取的简化测试用例。 因此,3个实体管理器和 em1.getTransaction().begin(); em1.clear(); em1.close(); 在每节的末尾。 在真实应用中,它发生在不同的时间。 HibernateUtil基本上是从教程中复制的Java StaleObjectStateException错误,java,hibernate,jpa,Java,Hibernate,Jpa,谁能告诉我这个错误 注意:这是从我的真实应用程序中提取的简化测试用例。 因此,3个实体管理器和 em1.getTransaction().begin(); em1.clear(); em1.close(); 在每节的末尾。 在真实应用中,它发生在不同的时间。 HibernateUtil基本上是从教程中复制的 HibernateUtil.open(); EntityManager em1 = HibernateUtil.reserveEntityManager()
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);
}
}
javax.persistence.OptimisticLockException:org.hibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存的值映射不正确):[WebOrganizer.classes.types.StringType#174]
位于org.hibernate.ejb.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:646)
位于org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:600)
位于org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:237)
在WebOrganizer.web.servlet.TypeServlet.test2(TypeServlet.java:356)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:580)
位于org.testng.internal.Invoker.invokeMethod(Invoker.java:517)
位于org.testng.internal.Invoker.invokeTestMethod(Invoker.java:669)
位于org.testng.internal.Invoker.invokeTestMethods(Invoker.java:956)
位于org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
位于org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:110)
位于org.testng.TestRunner.runWorkers(TestRunner.java:720)
位于org.testng.TestRunner.privateRun(TestRunner.java:590)
位于org.testng.TestRunner.run(TestRunner.java:484)
位于org.testng.SuiteRunner.runTest(SuiteRunner.java:332)
在org.testng.SuiteRunner.runSequential上(SuiteRunner.java:327)
位于org.testng.SuiteRunner.privateRun(SuiteRunner.java:299)
运行(SuiteRunner.java:204)
位于org.testng.testng.createAndRunSuiteRunners(testng.java:864)
位于org.testng.testng.runSuitesLocally(testng.java:830)
运行(testng.java:748)
位于org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:73)
位于org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:124)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
原因:org.hibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存的值映射不正确):[WebOrganizer.classes.types.StringType#174]
位于org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:261)
位于org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120)
位于org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53)
位于org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677)
位于org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661)
位于org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665)
位于org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:228)
... 28更多我想试试这样的东西:
EntityTransaction tx1 = em1.getTransaction();
// make your modifications
em1.merge(st1);
tx1.commit();
在清理EntityManager之前,不确定您为什么要开始事务。我不以编程方式处理JPA事务,所以这只是一个有根据的猜测。另外,如果每次都返回相同的实例,为什么要创建一个新的EntityManager?为什么要保存对象的中间状态?如果必须,请尝试另一种方法。传递标识符,确保在
get
之前和flush
之后立即启动事务
记住,刷新会话比调用commit要好。因为flush实际上在数据库中执行写操作,所以不需要调用close