我必须重构一个使用 Oracle 数据库和 Hibernate 的 EJB。这基本上是在数据库中添加更多字段,并在 EJB 中重构利用这些字段的方法。
但是我发现这样做后我得到了
ORA-00904: "XRF_SYSID": 无效标识符
(XRF_SYSID
作为新领域之一)。我很确定这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(Native Method) 在 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(Native Method) 在 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(Native Method) 在 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(Native Method) 在 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 更多