我正在测试我在春天创建的数据访问层(注入了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
答案 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;
我希望这会对你有所帮助。