如何在JPA DAO中捕获postgresql异常

时间:2016-07-20 08:27:32

标签: java postgresql hibernate jpa

我有psql中的序列使用的函数,用uid_number从1000到11000填充 user_ext 表中的新记录,当我有10000条记录时我需要抛出某种异常并且我试图再添一个。

我在DB中这样做了:

CREATE OR REPLACE FUNCTION uid_func(_seq regclass)
  RETURNS integer AS
$func$
BEGIN
    IF (SELECT COUNT(uid_number) FROM user_ext)>=10000 THEN
     RAISE EXCEPTION 'Uid numbers pool has been exhausted';
    ELSE
   LOOP
      PERFORM nextval(_seq);
      EXIT WHEN NOT EXISTS (SELECT 1000 FROM user_ext WHERE uid_number = lastval());
   END LOOP;
   RETURN lastval();
   END IF;
END
$func$  LANGUAGE plpgsql VOLATILE;

接下来我需要在JPA DAO中捕获此错误。 在Java中,我使用了一些函数(recalculateUsers),它通过NativeQuery将记录添加到 user_ext 表中,因此当recalculateUsers无法添加其他记录时,应抛出异常并稍后在java中处理。

我的问题是:如何在我的DAO中捕获RAISE EXCEPTION?

我试过了:

catch (SQLException ex) { 

但我得到了

SQLException is never thrown in the corresponding try block

这是我DAO中的方法:

public void refreshUsersPrivileges(List<String> userNames) {
        try {
            em.flush();
            Query query = em.createNativeQuery("SELECT cast(recalculateUsers(?) AS text)");
            query.setParameter(1, StringUtils.join(userNames, "|"));
            query.getSingleResult();
        } catch (PersistenceException ex) {
            throw new InternalUnexpectedException(GENERIC_DAO_COMPONENT, MessageUtil.getMessage(USER_MESSAGE_BUNDLE,
                    "Common.UserMessage.InternalUnexpectedException.UnexpectedCondition"), ex);
        } catch (SQLException ex) {
            final String ss = ex.getMessage();

            if (ss.equals("Uid numbers pool has been exhausted")) {

                throw new InternalUnexpectedException(GENERIC_DAO_COMPONENT, MessageUtil.getMessage(USER_MESSAGE_BUNDLE,
                        "Common.UserMessage.InternalUnexpectedException.UnexpectedCondition"), ex);
            }
        }
    }

0 个答案:

没有答案