2012-05-17 26 views
0

我目前正在測試我在Spring中創建的數據訪問層(PersistenceContext被注入)。所以我有一個無狀態的EJB調用服務,例如UserService,它插入/刪除/更新數據庫中的數據。如何捕獲PSQLException值太長,以便輸入字符變化

該服務工作正常,我能夠插入數據庫。但是,當我測試,我輸入的字符串值比設定長度我長:

javax.transaction.RollbackException: Transaction marked for rollback. 
WARNING: DTX5014: Caught exception in beforeCompletion() callback: 
javax.persistence.PersistenceException: org.hibernate.exception.DataException: ERROR: value too long for type character varying(20) 
Caused by: org.hibernate.exception.DataException: ERROR: value too long for type character varying(20) 
Caused by: org.hibernate.exception.DataException: ERROR: value too long for type character varying(20) 

我的部分代碼:

@PersistenceContext 
protected EntityManager entityManager; 

try { 
    entityManager.persist(e); 
} catch(Exception e) { 
    //log message here 
} 

然後我用盡了一切捕獲這些錯誤,但我不能。有關如何解決問題的任何建議?

感謝,
czetsuya

+0

*我無法*不是我之前見過的錯誤信息。什麼沒有工作。向我們展示您試圖捕捉錯誤的代碼,並解釋爲什麼「*無法」捕捉它。 –

+0

代碼就在那裏:entityManager.persist(e),問題是我插入的值太長,例如name(5)的字段,然後插入namenamename。即使我用try/catch封裝了persist()方法,也無法捕獲錯誤。 – czetsuya

+0

我的代碼中仍然沒有看到任何try/catch。而你仍然沒有解釋爲什麼你無法捕捉它。 –

回答

1

我用下面的代碼來找出哪些錯誤是根據您的具體情況拋出:

BEGIN; 
CREATE TABLE t(v varchar(5)); 
DO $body$ 
BEGIN 
    INSERT INTO t VALUES ('1234567'); 
EXCEPTION WHEN OTHERS THEN 
    RAISE NOTICE '!!! %, %', SQLSTATE, SQLERRM; 
END;$body$; 
ROLLBACK; 

你會看到,該錯誤代碼是22001,錯誤被命名爲string_data_right_truncation/PostrgeSQL's list of error codes

我不知道如何捕捉在Hibernate這個錯誤,但在PL/pgSQL level你可以做到這一點使用:

EXCEPTION WHEN SQLSTATE '22001' THEN 
    -- your code follows 
END; 

我希望這會幫助你。

+0

感謝您的回覆,嗯,但我不能真的使用這個,因爲錯誤發生在不存儲過程的代碼: - ? – czetsuya

+0

在第一個代碼塊中,我將'INSERT'語句包裝到匿名代碼塊中。是的,這種處理只能在存儲過程中進行。但也許你可以在Hibernate中使用'SQLSTATE'?.. – vyegorov

相關問題