Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何捕获PSQLException值太长,无法更改类型字符_Spring_Hibernate_Postgresql_Plpgsql - Fatal编程技术网

Spring 如何捕获PSQLException值太长,无法更改类型字符

Spring 如何捕获PSQLException值太长,无法更改类型字符,spring,hibernate,postgresql,plpgsql,Spring,Hibernate,Postgresql,Plpgsql,我目前正在测试我在spring中创建的数据访问层(PersistenceContext被注入)。因此,我有一个无状态EJB,它调用一个服务,例如UserService,在数据库中插入/删除/更新数据 服务很好,我可以插入数据库。但当我测试时,我输入的字符串值比我得到的设置长度长: javax.transaction.RollbackException: Transaction marked for rollback. WARNING: DTX5014: Caught exception in b

我目前正在测试我在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

我使用了以下代码来找出在您的情况下抛出的错误:

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\u data\u right\u truncation
per

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

SQL状态为“22001”时出现异常,然后 --你的代码如下 结束;
我希望这能对您有所帮助。

我以前没有看到过错误消息。到底是什么不起作用。向我们展示您试图捕获错误的代码,并解释您“*无法”捕获错误的原因。代码就在那里:entityManager.persist(e),问题是我插入的值对于字段太长,例如name(5),然后我插入了NameName。即使我用try/catch封装persist()方法,它也无法捕获错误。我仍然没有在代码中看到try/catch。你仍然没有解释为什么你不能抓住它。我已经添加了try-catch块。它只是简单地包装了persistent方法,我只是简单地调用entityManager的persistent方法,该方法在参数正确的情况下工作,但是当值对于它抛出的数据字段来说太长并且出现预期的错误时工作。但问题是我无法在代码中捕捉到它。可能容器很晚才调用提交。感谢您的回复,嗯,但我不能真正使用它,因为错误发生在代码上,而不是存储过程上:-?在第一个代码块中,我将
INSERT
语句包装到匿名代码块中。是的,这种处理只能在存储过程中进行。但是您也可以在Hibernate中使用
SQLSTATE
?。。