3

誰でも私にエラーを指摘できますか?

注: これは、実際のアプリから抽出した単純化されたテスト ケースです。したがって、3 つのエンティティ マネージャと em1.getTransaction().begin(); の奇妙な使用法。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] at org.hibernate.ejb.AbstractEntityManagerImpl. org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:600) で wrapStaleStateException(AbstractEntityManagerImpl.java:646) WebOrganizer.web.servlets.TypeServlet で org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:237) で.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.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) org.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) で sun.reflect.NativeMethodAccessorImpl.invoke0( Native Method) で 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) でrunSuitesLocally(TestNG.java:830) at org.testng.TestNG.run(TestNG.java:748) at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:73) at 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) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)runSuitesLocally(TestNG.java:830) at org.testng.TestNG.run(TestNG.java:748) at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:73) at 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) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)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)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] at 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. org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661) の impl.SessionImpl.fireMerge(SessionImpl.java:677) org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665) の org.hibernate .ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:228) ... 28 もっと見る

4

2 に答える 2

1

私はこのようなものを試してみます:

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

EntityManager をクリーンアップする直前にトランザクションを開始する理由がわかりません。私はプログラムで JPA トランザクションを扱っていないので、これは経験に基づいた推測にすぎません。また、同じインスタンスを返す場合、毎回新しい EntityManager を作成するのはなぜですか?

于 2009-01-10T18:33:09.873 に答える
0

オブジェクトの中間状態を保存するのはなぜですか?必要な場合は、別のアプローチを試してください。識別子を渡して、トランザクションを直前getflush直後に開始するようにします。

commitを呼び出すよりも、セッションをフラッシュする方がよいことを覚えておいてください。flashは実際にデータベースへの書き込みを実行するため、closeを呼び出す必要はありません。

于 2011-08-28T18:17:02.873 に答える