2012-12-02 27 views
0

我想刪除一個實體,如果它因爲約束而無法刪除,我想標記它以進行邏輯刪除。Jpa在刪除失敗後保存實體

這是我的代碼:

@Transactional 
    public void removeEntity(EntityDto e) { 

    Entity entity = entityRepository.findOne(e.getId()); 

    try { 
     entityRepository.delete(e.getId()); 
     entityRepository.flush(); 

    } catch (DataIntegrityViolationException ex) { 
     logger.debug("Logical removal"); 

     entity.setLogicalRemovalDate(new Date()); 
     entityRepository.save(entity); 
    } 
    } 

調用save()方法後,我得到這個異常:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.ObjectDeletedException: deleted instance passed to merge 

有什麼辦法,我可以實現這個功能?

謝謝。

回答

1

在一個新的事務中,不要在新的Hibernate會話中執行它。 The documentation說:

如果Session拋出異常,包括任何的SQLException, 立即回滾數據庫事務,調用Session.close() ,丟棄該Session實例。會話的某些方法不會 使會話保持一致狀態。 沒有拋出異常Hibernate可以被視爲可恢復。

在嘗試刪除它之前,您應該檢查是否沒有其他實體引用要刪除的實體。或者乾脆總是把它從邏輯上刪除,因爲它看起來就是你爲參考實體做的事情。

+0

謝謝,通過創建2個事務方法來修復,一個用於邏輯刪除,另一個用於物理。 – QQQ