Кто-нибудь может указать мне на ошибку, пожалуйста?
Примечание. Это упрощенный тестовый пример, извлеченный из моего реального приложения.
Таким образом, странное использование 3 менеджеров сущностей и
em1.getTransaction () начинается ().
em1.clear ();
em1.close ();
в конце каждого раздела.
В реальном приложении это происходит в разное время.
HibernateUtil в основном скопирован из учебника.
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.servlets.TypeServlet.test2 (TypeServlet.java:356)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
at 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.runSequentially (SuiteRunner.java:327)
в org.testng.SuiteRunner.privateRun (SuiteRunner.java:299)
в org.testng.SuiteRunner.run (SuiteRunner.java:204)
в org.testng.TestNG.createAndRunSuiteRunners (TestNG.java:864)
atg.testng.TestNG.runSuitesLocally (TestNG.java:830)
на org.testng.TestNG.run (TestNG.java:748)
на org.testng.remote.RemoteTestNG.run (RemoteTestNG.java:73)
в org.testng.remote.RemoteTestNG.main (RemoteTestNG.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)
в java.lang.reflect.Method.invoke (Method.java:597)
at 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