Hibernateを使用するアプリケーションがあり、テーブル内で変更または削除されたすべての行を履歴テーブルにコピーするトリガーを含める必要があります。PostgreSQLトリガーを含めた後、アプリケーションは正しく機能せず、次のエラーが発生します。
org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException:バッチ更新が更新[0]から予期しない行数を返しました。実際の行数:0; 予想:1; ネストされた例外はorg.hibernate.StaleStateExceptionです:バッチ更新は更新[0]から予期しない行数を返しました。実際の行数:0; 予想:1
しばらくグーグルした後、Hibernateがsql updateによって影響を受ける行をチェックし、トリガーも更新を行ったために返された行が予期されたものではないため、このエラーが発生することを発見しました。これは、トリガーの行数をオフにすることで修正できることを確認しました。しかし、PostgreSQLには「setnocounton」の代替手段がないようです。
以下に示すようなPostgreSQLのトリガーで問題を解決するにはどうすればよいですか?
ありがとう
CREATE OR REPLACE FUNCTION my_trigger_fnc() RETURNS TRIGGER AS $my_trigger_fnc$
DECLARE
nowDate timestamp := now();
BEGIN
INSERT INTO historial_table (
id,
date_now,
id_mytable,
--some other fields
...
)
VALUES (
nextVal('historial_table_seq'),
nowDate,
OLD.id_mytable
--some other fields
...
);
RETURN NEW;
END;
$my_trigger_fnc$ LANGUAGE plpgsql;
CREATE TRIGGER my_trigger BEFORE UPDATE OR DELETE
ON my_table FOR EACH ROW
EXECUTE PROCEDURE my_trigger_fnc();
更新:テーブルは次のようになります:
CREATE TABLE historial_table(
id integer,
date_now timestamp NOT NULL,
id_mytable integer NOT NULL,
nserie character varying(255),
idstore integer,
idmodel integer,
automatic boolean,
broken boolean,
idAlb integer,
idInc integer,
id_item integer,
date_assign timestamp,
PRIMARY KEY (id)
);
CREATE TABLE my_table(
id_mytable integer NOT NULL,
nserie character varying(255),
idstore integer,
idmodel integer,
automatic boolean,
broken boolean,
idAlb integer,
idInc integer,
id_item integer,
date_assign timestamp,
PRIMARY KEY (id_mytable)
);