0

我目前正在测试我在 spring 中创建的数据访问层(注入了 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

4

1 回答 1

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 的错误代码列表命名的。

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

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

我希望这能帮到您。

于 2012-05-17T09:14:38.480 回答