如何为类型字符变化捕获PSQLException值太长

时间:2012-05-17 08:51:29

标签: spring hibernate postgresql plpgsql

我正在测试我在春天创建的数据访问层(注入了PersistenceContext)。所以我有一个无状态EJB,它调用一个服务,例如UserService,它在数据库中插入/删除/更新数据。

服务工作正常,我能够插入数据库。但是当我测试时,我输入的字符串值比我得到的设置长度长:

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

1 个答案:

答案 0 :(得分: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,错误按PostrgeSQL's list of error codes命名为string_data_right_truncation

我不知道如何在Hibernate中捕获此错误,但在PL/pgSQL level上你可以使用:

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

我希望这会对你有所帮助。