Description:
after programmatic SchemaExport::drop(..) and SchemaExport::create(..) the table for the hilo generator (default: hibernate_unique_key) is reseted to contain '0' for next_hi (or whatever is configured).
The Problem is that the value of TableHiLoGenerator::lo is not set back to maxLo + 1. So the next generate call will not trigger the generate call within its super class (=TableGenerator) to set next_hi to '1' as it is the case during initialization (=configure(..)) (the if clause of TableHiLoGenerator:61 is not entered)
the result is that the TableHiLoGenerator will generate a wrong id sequences as follows:
0,1,..,
maxLo,0,1,..,maxLo,maxLo+1,...
note: the first few ids might not be missing if data is present before the Schema Export::drop (so TableHiLoGenerator::id might be eg: 13 if 12 rows where present before the Schema Export::drop(..))
Possible Solution:
reset lo within TableHiLoGenerator to
Code:
maxLo + 1
to "clock over" again on the first invocation whenever SchemaExport::create(..) is called
Hibernate version: 3.2.5
Mapping documents:Code between sessionFactory.openSession() and session.close():... insert some objects to db ...
Code:
SchemaExport export = new SchemaExport(source.getConfiguration());
export.drop(false, true);
SchemaExport export = new SchemaExport(source.getConfiguration());
export.create(false, true);
... insert lots (> 32768 (TableHiLoGenerator.maxLo)) of objects ...
Full stack trace of any exception that occurs:
rg.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2232)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:52)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at onepoint.persistence.hibernate.OpHibernateTransaction.commit(OpHibernateTransaction.java:30)
at onepoint.project.modules.backup.OpRestoreContext.commitRestoredObjects(OpRestoreContext.java:284)
at onepoint.project.modules.backup.OpRestoreContext.executeActiveObjectPersist(OpRestoreContext.java:212)
at onepoint.project.modules.backup.OpRestoreContext.persistActiveObject(OpRestoreContext.java:200)
at onepoint.project.modules.backup.OpObjectHandler.nodeFinished(OpObjectHandler.java:44)
at onepoint.xml.XDocumentHandler.endElement(XDocumentHandler.java:142)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at onepoint.xml.XLoader.loadObject(XLoader.java:53)
at onepoint.project.modules.backup.OpBackupLoader.loadBackup(OpBackupLoader.java:56)
at onepoint.project.modules.backup.OpBackupManager.restoreRepository(OpBackupManager.java:1118)
at onepoint.project.modules.backup.OpBackupManager.restoreRepository(OpBackupManager.java:842)
at onepoint.project.OpInitializer.restoreSchemaFromFile(OpInitializer.java:537)
at onepoint.project.modules.repository.OpRepositoryService.restore(OpRepositoryService.java:231)
at onepoint.project.modules.repository.OpRepositoryService$$EnhancerByCGLIB$$c2f9648e.CGLIB$restore$3(<generated>)
at onepoint.project.modules.repository.OpRepositoryService$$EnhancerByCGLIB$$c2f9648e$$FastClassByCGLIB$$b83295cd.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:167)
at onepoint.project.OpServiceInterceptor.intercept(OpServiceInterceptor.java:42)
at onepoint.project.modules.user.OpPermissionCheckServiceInterceptor.intercept(OpPermissionCheckServiceInterceptor.java:34)
at onepoint.project.modules.repository.OpRepositoryService$$EnhancerByCGLIB$$c2f9648e.restore(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at onepoint.service.server.XService.callJavaMethod(XService.java:78)
at onepoint.project.OpProjectService.callJavaMethod(OpProjectService.java:59)
at onepoint.service.server.XService.invokeMethod(XService.java:46)
at onepoint.service.server.XSession.invokeMethod(XSession.java:84)
at onepoint.express.server.XExpressSession.invokeMethod(XExpressSession.java:59)
at onepoint.service.server.XBinaryServlet.processRequest(XBinaryServlet.java:184)
at onepoint.project.servlet.OpOpenServlet.processRequest(OpOpenServlet.java:628)
at onepoint.service.server.XBinaryServlet.doPost(XBinaryServlet.java:135)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.BatchUpdateException: ORA-00001: Unique Constraint (OPPROJECT.SYS_C0028633) verletzt
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10720)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
... 70 more
Name and version of the database you are using:
postgresql, oracle, mysql, derby (different versions/best is Postgres gives the Id of the object that causes the ConstraintViolationException)
The generated SQL (show_sql=true):
na, quite long had to insert more than TableHiLoGenerator.maxLo elements)
Debug level Hibernate log excerpt:
na