2010-12-18 10 views
1

Ich habe eine Datei (diese Datei hat Tab-getrennte Werte), die in eine der Datenbanktabellen geschrieben werden muss. Diese Datei kann auch doppelte Einträge enthalten. Ich verarbeite die Datensätze in der Datei in 5000, also analysiere ich zuerst diese ersten 5000 Datensätze in der Datei, wenn sie doppelte Einträge enthalten. Ich ignoriere einfach die Duplikate und schreibe die eindeutigen Datensätze zwischen ihnen in die Datenbank und wiederhole die nächsten 5000 erneut Aufzeichnungen in ähnlicher Weise bis EOF erreicht wird. Jetzt, während diese 5000 Datensätze geschrieben werden, ist es möglich, dass es Duplikate zwischen den Sätzen von 5000 Datensätzen gibt und wenn das passiert (dann wirft die Datenbank die DomainObjectExistsException), dann fange ich die Ausnahme und aktualisiere einfach den Datensatz. Ich bin der Durchführung der Update-Vorgang wie folgt aus:Ausnahme beim Schreiben in die Datenbank (org.hibernate.exception.ConstraintViolationException)

getHibernateTemplate().saveOrUpdate(femtoFactoryData); 

Wo femtoFactoryData ist ein Java Object (POJO), die von den Tab-separierte Werte in der Datei aufgebaut in die Datenbanktabelle geschrieben werden muss. Der Primärschlüssel der Tabelle ist nichts anderes als die ID des Femto und der Status (temporär/permanent).

Aber während diese Update-Operation Ich erhalte:

org.hibernate.exception.ConstraintViolationException 

Hier wird der Stacktrace aus meinem Programm ist:

org.hibernate.exception.ConstraintViolationException: could not insert: [com.airvana.anp.model.db.domainobjects.FemtoFactoryData] 
     at com.airvana.anp.model.db.impl.DbManagerGlobalUtils.convertException(DbManagerGlobalUtils.java:68) 
     at com.airvana.anp.model.db.impl.FemtoFactoryDataDAOImplHelper.updateFemtoFactoryData(FemtoFactoryDataDAOImplHelper.java:302) 
     at com.airvana.anp.model.db.impl.FemtoFactoryDataDAOImpl.updateFemtoFactoryData(FemtoFactoryDataDAOImpl.java:149) 
     at com.airvana.anp.model.oss.imports.common.DataRecordDAOHelperImpl.updateRecord(DataRecordDAOHelperImpl.java:725) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:585) 
     at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198) 
     at $Proxy89.updateRecord(Unknown Source) 
     at com.airvana.anp.model.oss.imports.parser.ParseControllerImpl.saveDupFactoryRecordsInDb(ParseControllerImpl.java:477) 
     at com.airvana.anp.model.oss.imports.parser.ParseControllerImpl.parseFile(ParseControllerImpl.java:111) 
     at com.airvana.anp.model.oss.imports.FactoryOperationsManagerImpl.onAllocation(FactoryOperationsManagerImpl.java:192) 
     at com.airvana.anp.model.resource.impl.CallbackWorkerJob.run(CallbackWorkerJob.java:43) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) 
     at java.lang.Thread.run(Thread.java:595) 
Caused by: org.springframework.dao.DataIntegrityViolationException: could not insert: [com.airvana.anp.model.db.domainobjects.FemtoFactoryData]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.airvana.anp.model.db.domainobjects.FemtoFactoryData] 
     at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:624) 
     at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) 
     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
     at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
     at org.springframework.orm.hibernate3.HibernateTemplate.merge(HibernateTemplate.java:820) 
     at com.airvana.anp.model.db.impl.FemtoFactoryDataDAOImplHelper.updateFemtoFactoryData(FemtoFactoryDataDAOImplHelper.java:299) 
     ... 16 more 
Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.airvana.anp.model.db.domainobjects.FemtoFactoryData] 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2272) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665) 
     at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:56) 
     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 
     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:1004) 
     at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390) 
     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:420) 
     ... 19 more 
Caused by: java.sql.SQLException: ORA-00001: unique constraint (ANPDB.SYS_C008651) violated 

     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
     at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
     at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 
     at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743) 
     at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216) 
     at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955) 
     at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168) 
     at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3316) 
     at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3400) 
     at weblogic.jdbc.wrapper.PreparedStatement.executeUpdate(PreparedStatement.java:128) 
     at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2252) 
     ... 29 more 

Antwort

4

Sie sind nicht Duplikate richtig Handhabung, da einzigartig offensichtlich Einschränkungsverletzung ist es in Bezug auf Schlüssel.

Ich würde empfehlen, diese Duplikate vollständig zu entfernen, bevor Sie sie in die Datenbank einfügen.

Erinnern Sie sich: die Datenbank ist Ihre letzte Verteidigungslinie. Wenn man den poetischen Aspekt ignoriert, heißt das im Grunde genommen, dass man alles tun sollte, um in die Datenbank genau das einzufügen, was man braucht. Nicht mehr, nicht weniger. Filtern, entfernen Sie Duplikate, was auch immer auf Ihrer Serverseite vor dem Senden an die Datenbank.

+0

Könnten Sie ein wenig mehr zu "da gibt es offensichtlich Einschränkung Verletzung in Bezug auf eindeutige Schlüssel"? Okay, was ist, wenn ich in meiner Datei nehme, habe ich zwei Einträge, unter denen der eindeutige Teil für beide gleich ist, aber der Rest des Wertes unterscheidet sich, wie mache ich dann den Update-Vorgang? – Cheshar

+0

@darioo: Danke für deine Hilfe ... hab verstanden, warum ich den Fehler bekommen habe ... war mit Unique Index und Primary Key verwechselt !! :) – Cheshar

+0

@Cheshar: kein Problem :-) Sie können diese Antwort akzeptieren, wenn Sie es nützlich fanden. – darioo

Verwandte Themen