2010-12-18 74 views
1

我有一個文件(該文件實際上具有製表符分隔值),必須將其寫入其中一個數據庫表。該文件也可以包含重複的條目。我正在處理5000個文件中的記錄,所以我首先解析文件中的前5000條記錄,如果它們包含任何重複的條目,我只需忽略重複項並將其中的唯一記錄寫入數據庫,然後再處理下一個5000以相似的方式記錄直到達到EOF。現在在編寫這5000條記錄時,可能在5000條記錄集之間有重複,如果發生這種情況(然後數據庫拋出DomainObjectExistsException),那麼我捕獲異常並簡單地更新記錄。我喜歡這個執行該更新操作:寫入數據庫時​​發生異常(org.hibernate.exception.ConstraintViolationException)

getHibernateTemplate().saveOrUpdate(femtoFactoryData); 

凡femtoFactoryData是Java對象(PO​​JO),其具有要被寫入到從該文件中的標籤分隔值構成的數據庫表。該表的主鍵不過是毫微微和狀態(臨時/永久)的ID。

但在執行此更新操作我得到:

org.hibernate.exception.ConstraintViolationException 

這裏是我的程序的堆棧跟蹤:

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 

回答

4

你不處理重複正確的,因爲有關於唯一明顯的約束衝突鍵。

我建議在將它們插入數據庫之前完全消除這些重複項。

請記住:數據庫是您的最後一道防線。忽略詩意的方面,基本上說,你應該盡一切可能在你的數據庫中插入所需的東西。沒有更多,沒有更多。在將數據發送到數據庫之前,過濾掉您的服務器端的重複項。

+0

您能詳細解釋一下「因爲唯一鍵有明顯的約束違規」嗎?好吧,如果在我的文件中假設我有兩個條目,其中唯一部分對於兩個條目都是相同的,但其餘值不同,那麼如何執行更新操作? – Cheshar 2010-12-19 10:23:16

+0

@darioo:感謝您的幫助...明白了爲什麼我得到錯誤...與唯一索引和主鍵混淆! :) – Cheshar 2010-12-20 07:53:16

+0

@Cheshar:沒問題:-)如果你覺得它有用,你可以接受這個答案。 – darioo 2010-12-20 08:00:20