最近、プロジェクトのバックエンドを MySQL から PostgreSQL に切り替えたところ、データベース プロキシ メソッドのいくつかを確認する必要があることがわかりました。リンクされたオブジェクトを挿入するには、トランザクションを使用してすべてが保存されていることを確認します。setAutoCommit(false)
やなどの jdbc メソッドを使用してこれを行いますcommit()
。テーブルにレコードを挿入し、生成されたキーを返すユーティリティ メソッドを作成しました。基本的に、ここで説明されているように、テクニック 2 に従いました。
http://www.selikoff.net/2008/09/03/database-key-generation-in-Java-applications/
これはプロジェクトの開始以来機能していましたが、MySQL から PostgreSQL に移行した後、新しく挿入されたレコードのすべての列getGeneratedKeys
が返されます(以下のコンソール出力を参照)。
コード:
final ResultSet keys = ps.getGeneratedKeys();
final ResultSetMetaData metaData = keys.getMetaData();
for (int j = 0; j < metaData.getColumnCount(); j++) {
System.out.println("Col name: "+metaData.getColumnName(j+1));
}
出力:
Col name: pathstart
Col name: fk_id_c
Col name: xpathid
Col name: firstnodeisroot
テーブルのデータベース署名 (pgAdmin III から自動生成された SQL):
CREATE TABLE configuration.configuration_xpath
(
pathstart integer NOT NULL,
fk_id_c integer NOT NULL,
xpathid integer NOT NULL DEFAULT nextval('configuration.configuration_xpath_id_seq'::regclass),
firstnodeisroot boolean NOT NULL DEFAULT false,
CONSTRAINT configuration_xpath_pkey PRIMARY KEY (xpathid),
CONSTRAINT configuration_fk FOREIGN KEY (fk_id_c)
REFERENCES configuration.configuration (id_c) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
PK の背後にあるシーケンスのデータベース署名:
CREATE SEQUENCE configuration.configuration_xpath_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 242
CACHE 1
OWNED BY configuration.configuration_xpath.xpathid;
getGeneratedKeys
問題は、生成されたキーだけでなく、すべての列を返すのはなぜですか? ここで同様の問題を抱えている他の人を検索して見つけました:
http://www.postgresql.org/message-id/004801cb7518$cbc632e0$635298a0$@pravdin@disi.unitn.it
しかし、彼らの質問には回答がなく、提案された回避策のみが提供されています。