JPA持続化異常:PersistenceException:org.hibernate.PersistentObjectException

2745 ワード

1.PersistenceException異常は以下の通り
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.java.bean.Student at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:780) at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:758) at com.java.test.Test.testInsertS(Test.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at junit.framework.TestCase.runTest(TestCase.java:176) at junit.framework.TestCase.runBare(TestCase.java:141) at junit.framework.TestResult$1.protect(TestResult.java:122) at junit.framework.TestResult.runProtected(TestResult.java:142) at junit.framework.TestResult.run(TestResult.java:125) at junit.framework.TestCase.run(TestCase.java:129) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:131) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: com.java.bean.Student at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:124) at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58) at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:773) … 18 more
2.通常PersistenceExceptionの原因が現れる
通常の理由は、プライマリ・キー自己増加ポリシー@GeneratedValue(strategy=GenerationType.IDENTITY)が設定されているためです.
1-プライマリ・キーの自己増加を設定する場合は、データベースにプライマリ・キーの自己増加と対応するエンティティ・クラスに対応するプライマリ・キーの自己増加を設定する必要があります.どちらか一方が設定されていない場合は、この例外を報告します.
2-プライマリ・キーを設定して自増し、データを保存する場合、自分でプライマリ・キーを設定すると、PersistenceExceptionにも報告されます
たとえばStudentクラスではsidがプライマリキーであり,プライマリキーの自己増加が設定されているが,持続化するとnewオブジェクトにidが与えられる.
Student tStudent=new Student(2, "  ", 2);//     ,    sid