【问题标题】:How to catch PSQLException value too long for type character varying如何捕获 PSQLException 值对于类型字符变化太长
【发布时间】:2012-05-17 08:51:29
【问题描述】:

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

然后我尝试了一切来捕捉这些错误,但我无法做到。关于如何解决问题的任何建议?

谢谢,
切苏亚

【问题讨论】:

  • I was not able to 不是我以前见过的错误消息。究竟是什么不起作用。向我们展示您尝试捕获错误的代码并解释为什么您“*无法”捕获它。
  • 代码就在那里:entityManager.persist(e),问题是我插入的值对于字段来说太长,例如 name(5),然后我插入 namenamename。即使我用 try/catch 封装了 persist() 方法,它也无法捕捉到错误。
  • 我仍然没有在您的代码中看到任何 try/catch。而且你仍然没有解释为什么你不能抓住它。
  • 我添加了 try catch 块。它只是简单地包装了 persists 方法。
  • 我只是简单地调用 entityManager 的 persist 方法,该方法在参数正确时起作用,但是当数据字段的值太长时,它会按预期抛出错误。但问题是我无法在代码中捕捉到它。也许提交是由容器延迟调用的。

标签: spring hibernate postgresql plpgsql


【解决方案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 per PostrgeSQL's list of error codes

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

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

希望对你有帮助。

【讨论】:

  • 感谢您的回复,嗯,但我不能真正使用它,因为错误发生在代码而不是存储过程上:-?
  • 在第一个代码块中,我将INSERT 语句包装到匿名代码块中。是的,这种处理只能在存储过程中进行。但也许你也可以在 Hibernate 中使用SQLSTATE?..
猜你喜欢
  • 2020-03-27
  • 2021-12-20
  • 2016-07-26
  • 2021-04-03
  • 2019-12-18
  • 2021-03-02
  • 1970-01-01
  • 2021-10-20
  • 2011-12-06
相关资源
最近更新 更多