5

私は、PostgreSQL データベース内のさまざまなシリアル列のシーケンスを再開する任務を負っています。通常、私は単に使用します:

ALTER SEQUENCE serial RESTART WITH 105;

ただし、Hibernate を使用してデータベース シーケンスを処理しているようです。私は本当に Hibernate について何も知りませんが、hibernate_sequence はすべてのテーブルのグローバル シーケンスであると理解しています。あれは正しいですか?

次に、次のことを行う必要があると想定しています。

ALTER SEQUENCE hibernate_sequence RESTART WITH 105;

しかし、結果がどうなるかはわかりません。テーブル A、B、C、および D があるとします。これらの各テーブルには、シリアル型の ID 列があります。上記の hibernate_sequence の SQL ステートメントは、すべてのテーブルの ID 列を再起動しますか?

ありがとう!

4

1 に答える 1

4

まず、ここに根底にある問題があります。シーケンスの値を、何かを意味するものとして扱っています。答えの最後を参照してください。

現在、Hibernate では、ユーザーがマッピングをどのように構成しているかによって異なります。適切に構成された Hibernate インスタンスは、他のすべてのものと同じシーケンスを使用します。

残念ながら、ほとんどのマッピングはあまり良くありません。むしろ、Hibernate のデフォルトの動作はひどいものであり、常にオーバーライドする必要があると思います。使用されるデフォルトのシーケンスは、実際にはhibernate_sequenceすべてのテーブルで共有されます。ただし、一部のテーブルで独自のシーケンスを使用し、他のテーブルで shared を使用しhibernate_sequenceたり、すべてのテーブルで独自のシーケンスを適切に使用したりすることは完全に可能です。

決定的な回答を有効にするには、マッピングを投稿する必要があります。

ID 生成を変更したいテーブルが Hibernate マッピングでテーブルの正しいシーケンスを使用している場合は、そのシーケンスに進むことができALTER SEQUENCEます。マッピングが JPA 経由である場合、それは@SequenceGenerator@GeneratedValueで行われGenerationType.SEQUENCEます。orm.xml、または古いスタイルの Hibernate アノテーションを使用して行うhbm.xml場合は、マニュアルを確認する必要があります。または、Hibernate が DB に書き込む唯一のクライアントである場合は、シーケンスを調べて、SELECT * FROM sequence_name.

対象のテーブルのマッピングが共有hibernate_sequenceを使用している場合、Hibernate マッピングを修正しないと、おそらくやりたいことができないでしょう。マッピングを変更して、対象のテーブルのマッピングが別のシーケンスを使用するように`LOCK TABLEし、それらのシーケンスの開始点を現在テーブルにある最大の行に設定する必要があります。

シーケンス: シーケンスを変更または再起動する必要があるのはなぜですか? 合成主キーは、他の無意味な数値と等しいかどうかを比較するだけの無意味な数値であるため、問題にはなりません。あなたが解決しようとしている問題は何ですか?

于 2012-08-17T14:48:05.430 に答える