2012-05-17 23 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

相关问题