0

我正在使用以下 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

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

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 代码中引发异常?

提前致谢..!!

4

1 回答 1

0

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

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

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

如何禁用休眠缓存

于 2013-11-08T01:54:04.580 回答