当前位置: 首页 > 知识库问答 >
问题:

Java Hibernate中未捕获PostgreSQL函数中的异常

单于耘豪
2023-03-14

我正在使用以下PostgreSQL函数从数据库中的表中删除记录。

CREATE OR REPLACE FUNCTION deletesegment(segid bigint) RETURNS integer AS
    $BODY$
    DECLARE
        rowsAffected integer := 0;
    BEGIN
        DELETE FROM segment
        WHERE
            id = segid;
        GET DIAGNOSTICS rowsAffected = ROW_COUNT;
        RETURN rowsAffected;
    EXCEPTION
        WHEN foreign_key_violation THEN
            RAISE EXCEPTION foreign_key_violation;
    END;
$BODY$
    LANGUAGE plpgsql;

上表的主键列(即段表的id列)被另一个表引用为外键,当我执行上述函数从另一个表引用的段表中删除记录时,该函数会按预期引发错误(如下所示)。

ERROR:  foreign_key_violation

********** Error **********

ERROR: foreign_key_violation
SQL state: 23503

现在我从我的Java代码调用这个PostgreSQL函数,它使用Hibernate如下所示,

public int deleteSegment(Long segmentId) {

        SQLQuery query = (SQLQuery)sessionFactory.getCurrentSession().createSQLQuery("SELECT deletesegment(:segmentId)")
            .setParameter("segmentId", segmentId);

        int rows = (Integer)(query.list().get(0));

        return rows;
    }

当我将相同的id传递给上述函数(Integer)(query.list()时。get(0))执行时不会引发任何异常,并返回0。鉴于底层PostgreSQL函数正在引发异常,我希望它会引发异常。但事实并非如此。

我做错了什么。我如何才能在Java代码中提出异常?

感谢提前...!!

共有1个答案

鱼征
2023-03-14

您的问题几乎可以肯定是Hibernate正在为您缓存查询。您必须研究如何为此禁用查询缓存。

Hibernate有许多不同的缓存类型,其中一种是二级缓存,用于缓存数据库查询结果并进行备份。这可能是你必须禁用的。

对于一些开始的想法,请查看另一个问题:

如何禁用Hibernate缓存

 类似资料:
  • 我的用它的作用域启动coroutine 我的只处理一些逻辑,在本例中是某种验证器 然后我的只处理网络层/本地层 以下是我得到的错误日志: 错误直接指向显式的语句。

  • 我有以下代码。 然而,它没有捕捉到所有的错误,我仍然得到“throw er//未处理的“错误”事件。 这是为什么呢? 例如,直到我添加了一个特定的错误处理程序,它才捕获parse()函数中的错误。即使不添加,我的try/catch是否应该捕获此错误? 提前致谢!

  • 我已经使用C#(库项目)和Aspect(AOP)编写了Azure函数v1用于日志记录。我在catch块中没有得到异常。 捕获异步方法引发的异常 我有上面讨论的相同问题,但Azure函数运行方法是异步任务,其异常处理和异步void相同。不确定哪里有问题?假设这是函数SDK问题。 Azure函数 记录器方面 解决方法:当我从Azure函数中删除异步等待并通过“getWaiter().GetResult

  • 我正在尝试创建一个过滤器来处理异常(请参见在JSF中处理未捕获的异常) 我在日志中看到错误: 我做错了什么?

  • 我不知道为什么会这样,但当我有: 错误消失了。 更新这是我的完整html代码:

  • 问题内容: 好,我有问题。如果在处理HTTP请求时发生未捕获的异常,则我没有机会在http.ServerResponse对象上调用end()方法。因此,服务器将永远挂起并且永远不会满足该请求。 这是一个例子: 如果访问/ error,则会发生异常,但会被捕获。用户收到错误消息-没问题。但是,如果我访问/ hang,服务器最终将抛出未捕获的异常并永远挂起。以后对/ hang的任何请求都将挂起。 糟透