2017-08-04 148 views
0

我使用Spring和Hibernate框架,並試圖更新的對象並不在DB(不存在的條目)存在,但它返回的錯誤HTTP Status 500如何處理Hibernate異常?

HTTP Status 500 - Request processing failed; nested exception is org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

這是我的服務,但它並沒有趕上例外

@Override 
    public ResponseEntity<?> update(CoverSheet coverSheet) { 
     try { 
      this.coverSheetDao.edit(coverSheet);     
      return CryptoUtils.generateSuccessResponseEntity(coverSheet); 
     } catch (Exception e) { 
      e.printStackTrace();     
      return CryptoUtils.generateFailureResponseEntity(ErrorCode.CODE_SQL_EXCEPTION, e.getMessage()); 
     } 
    } 

你能幫我嗎?非常感謝!

+1

它deppends異常上。你的情況我會說有一個不存在的數據庫中的條目的更新,所以我會發送一個404返回碼。但是,只有我的意見,沒有足夠的關於你的功能的知識 – Jens

+0

@Jens你能否給我更多的細節? –

+0

只是爲了理解這個問題。你知道異常是在哪裏拋出的嗎?如果它位於try-block內部但未被捕獲,那對我來說就非常令人驚訝。它可能比在構建過程中有些東西被破壞,並且它運行了過時的代碼版本。異常類型應該被catch(Exception)塊捕獲。 –

回答

0

我修正了這個錯誤。實際更新查詢在沖洗時執行。不在會話中調用update()時。在這種特殊情況下,刷新發生在事務包裝對服務方法的調用提交之前。順便說一句,可以看到在堆棧跟蹤:

at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485) 

所以我趕上了服務之外的例外(如:控制器):

try { 
     return contactService.update(contact); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return CryptoUtils.generateFailureResponseEntity(ErrorCode.CODE_SQL_EXCEPTION, e.getMessage()); 
    }