2014-07-11 27 views
0

我正在使用彈簧&以Hiberate作爲供應商的JPA。Spring項目的DAO層中的異常處理JPA

在DAO層我試圖堅持實體。如果存在重複,則會拋出Hibernate的ConstraintViolationException異常。我已經在DAO中編寫了try-catch來捕獲異常,但是它根本不會去捕獲塊並將異常拋出到服務層。 JPA是否允許在DAO層中捕獲JDBCException,或者它會直接將其扔到上層?

我的代碼看起來像如下:

public void saveEntity(SomeEntity entity) throws CustomException { 
    try { 
     ... do something... 
     entityManager.persist(entity); 
    }catch(Exception e) { 
     throw new CustomException(e.getMessage()); 
    } 
} 

這裏如果事情發生之前堅持它捕獲,但如果出了問題,而堅持和的JDBCException來臨都沒有。

我知道我可以避免這種情況,首先檢查是否存在記錄,如果不存在,只有這樣我才能保存。但是我想知道爲什麼JDBCException(或任何與數據庫相關的異常)異常沒有被抓到。

任何幫助表示讚賞。

回答

1

我找到了原因。

DAO類中的catch塊無法捕獲異常,因爲事務提交是在​​方法執行後發生的,所以我放置了@Transactional(服務層方法)的方法正在捕獲異常。

這裏,如果我在使用flush()之後立即執行,它會嘗試在那裏提交併拋出將被捕獲的Exception。

public void saveEntity(SomeEntity entity) throws CustomException { 
    try { 
     ... do something... 
     entityManager.persist(entity); 
     entityManager.flush(); //tries to commit here & throws ConstraintViolationException if already exists 
    }catch(Exception e) { 
     throw new CustomException(e.getMessage()); 
    } 
}