Oracle データベースと Hibernate を使用する EJB をリファクタリングする必要があります。基本的には、データベースにさらにいくつかのフィールドを追加し、それらのフィールドを利用する EJB のメソッドをリファクタリングするケースです。
しかし、これを行った後、私は得ていることがわかりました
ORA-00904: "XRF_SYSID": 識別子が無効です
(XRF_SYSID
新しいフィールドの1つです)。XRF_SYSID
Oracleデータベースの命名規則に違反していないと確信しています。キャッシュがまだ古いデータベース構造を使用している可能性があると思いましたが、Hibernate 構成ではキャッシュがオンになっていません。EJB を元のフィールドを使用するように切り替えても、まだ機能します。
これはSQLです:
insert into XRF_CROSS_REFERENCE
(XRF_COMPANY, XRF_CREATED, XRF_DISCARD_NUMBER, XRF_EDITOR, XRF_KEY, XRF_LAST_EDITED, XRF_MANCOID, XRF_STATUS, XRF_SYSID, XRF_VALUE, XRF_ID)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
エラーログ:
12:29:08,584 エラー [org.hibernate.event.def.AbstractFlushingEventListener] データベースの状態をセッションと同期できませんでした org.hibernate.exception.SQLGrammarException: JDBC バッチ更新を実行できませんでした org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:90) で org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) で org.hibernate.jdbc.AbstractBatcher.executeBatch (AbstractBatcher.java:275) で org.hibernate.engine.ActionQueue.executeActions (ActionQueue.java:266) で org.hibernate.engine.ActionQueue.executeActions (ActionQueue.java:167) で org.hibernate.event.def.AbstractFlushingEventListener.performExecutions (AbstractFlushingEventListener.java:321) で org.hibernate.event.def.DefaultFlushEventListener.onFlush (DefaultFlushEventListener.java:50) で org.hibernate.impl.SessionImpl.flush (SessionImpl.java:1027) で org.hibernate.impl.SessionImpl.managedFlush (SessionImpl.java:365) で org.hibernate.transaction.JDBCTransaction.commit (JDBCTransaction.java:137) で uk.co.ifdsgroup.xref.util.HibernateUtil.save (HibernateUtil.java:104) で uk.co.ifdsgroup.xref.domain.CrossReferenceTest.testPersistance (CrossReferenceTest.java:59) で 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.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) で org.junit.internal.runners.MethodRoadie.runTestMethod (MethodRoadie.java:98) で org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) で org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters (MethodRoadie.java:87) で org.junit.internal.runners.MethodRoadie.runTest (MethodRoadie.java:77) で org.junit.internal.runners.MethodRoadie.run (MethodRoadie.java:42) で org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod (JUnit4ClassRunner.java:88) で org.junit.internal.runners.JUnit4ClassRunner.runMethods (JUnit4ClassRunner.java:51) で org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) で org.junit.internal.runners.ClassRoadie.runUnprotected (ClassRoadie.java:27) で org.junit.internal.runners.ClassRoadie.runProtected (ClassRoadie.java:37) で org.junit.internal.runners.JUnit4ClassRunner.run (JUnit4ClassRunner.java:42) で org.apache.maven.surefire.junit4.JUnit4TestSet.execute (JUnit4TestSet.java:59) で org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet (AbstractDirectoryTestSuite.java:120) で org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute (AbstractDirectoryTestSuite.java:103) で org.apache.maven.surefire.Surefire.run (Surefire.java:169) で 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.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess (SurefireBooter.java:350) で org.apache.maven.surefire.booter.SurefireBooter.main (SurefireBooter.java:1021) で 原因: java.sql.BatchUpdateException: ORA-00904: "XRF_SYSID": 無効な識別子 oracle.jdbc.driver.DatabaseError.throwBatchUpdateException (DatabaseError.java:629) で oracle.jdbc.driver.OraclePreparedStatement.executeBatch (OraclePreparedStatement.java:9409) で oracle.jdbc.driver.OracleStatementWrapper.executeBatch (OracleStatementWrapper.java:211) で org.hibernate.jdbc.BatchingBatcher.doExecuteBatch (BatchingBatcher.java:70) で org.hibernate.jdbc.AbstractBatcher.executeBatch (AbstractBatcher.java:268) で ... 35以上 12:29:08,586 WARN [uk.co.ifdsgroup.xref.util.HibernateUtil] オブジェクトの保存に関する問題 org.hibernate.exception.SQLGrammarException: JDBC バッチ更新を実行できませんでした org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:90) で org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) で org.hibernate.jdbc.AbstractBatcher.executeBatch (AbstractBatcher.java:275) で org.hibernate.engine.ActionQueue.executeActions (ActionQueue.java:266) で org.hibernate.engine.ActionQueue.executeActions (ActionQueue.java:167) で org.hibernate.event.def.AbstractFlushingEventListener.performExecutions (AbstractFlushingEventListener.java:321) で org.hibernate.event.def.DefaultFlushEventListener.onFlush (DefaultFlushEventListener.java:50) で org.hibernate.impl.SessionImpl.flush (SessionImpl.java:1027) で org.hibernate.impl.SessionImpl.managedFlush (SessionImpl.java:365) で org.hibernate.transaction.JDBCTransaction.commit (JDBCTransaction.java:137) で uk.co.ifdsgroup.xref.util.HibernateUtil.save (HibernateUtil.java:104) で uk.co.ifdsgroup.xref.domain.CrossReferenceTest.testPersistance (CrossReferenceTest.java:59) で 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.junit.internal.runners.TestMethod.invoke(TestMethod.java:59) で org.junit.internal.runners.MethodRoadie.runTestMethod (MethodRoadie.java:98) で org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79) で org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters (MethodRoadie.java:87) で org.junit.internal.runners.MethodRoadie.runTest (MethodRoadie.java:77) で org.junit.internal.runners.MethodRoadie.run (MethodRoadie.java:42) で org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod (JUnit4ClassRunner.java:88) で org.junit.internal.runners.JUnit4ClassRunner.runMethods (JUnit4ClassRunner.java:51) で org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) で org.junit.internal.runners.ClassRoadie.runUnprotected (ClassRoadie.java:27) で org.junit.internal.runners.ClassRoadie.runProtected (ClassRoadie.java:37) で org.junit.internal.runners.JUnit4ClassRunner.run (JUnit4ClassRunner.java:42) で org.apache.maven.surefire.junit4.JUnit4TestSet.execute (JUnit4TestSet.java:59) で org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet (AbstractDirectoryTestSuite.java:120) で org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute (AbstractDirectoryTestSuite.java:103) で org.apache.maven.surefire.Surefire.run (Surefire.java:169) で 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.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess (SurefireBooter.java:350) で org.apache.maven.surefire.booter.SurefireBooter.main (SurefireBooter.java:1021) で 原因: java.sql.BatchUpdateException: ORA-00904: "XRF_SYSID": 無効な識別子 oracle.jdbc.driver.DatabaseError.throwBatchUpdateException (DatabaseError.java:629) で oracle.jdbc.driver.OraclePreparedStatement.executeBatch (OraclePreparedStatement.java:9409) で oracle.jdbc.driver.OracleStatementWrapper.executeBatch (OracleStatementWrapper.java:211) で org.hibernate.jdbc.BatchingBatcher.doExecuteBatch (BatchingBatcher.java:70) で org.hibernate.jdbc.AbstractBatcher.executeBatch (AbstractBatcher.java:268) で ... 35以上