6

シーケンス生成の主キーで定義されたエンティティがあります。

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_key_gen")
@SequenceGenerator(name = "id_key_gen", sequenceName = "id_key_seq")
@Column(name = "id", unique = true, nullable = false)
public int getId() {
    return this.id;
}

私は PostgreSQL を使用しており、このキーはシリアルとして定義されています。PostgreSQLによると

select last_value from id_key_seq;

戻り値

1603.

このエンティティのインスタンスを永続化するために create() を実行すると、ログに次のように表示されます (無関係なものは編集されています)。


05 15:15:26.948 org.hibernate.id.enhanced.SequenceStructure [DEBUG] - 取得したシーケンス値: 1604

05 15:15:26.948 org.hibernate.event.def.AbstractSaveEventListener [DEBUG] - 生成された識別子: 1554、戦略を使用: org.hibernate.id.enhanced.SequenceStyleGenerator


後続の SQL 挿入ステートメントは、値 1554 を参照します。値 1604 (SequenceStructure から返された値に基づく) ではなく、1554 を参照します。Hibernate はどこから 1554 を取得しましたか ?

Hibernate にはここにバグがあるようです。SequenceStructure は正しい次の値を認識していますが、使用されていません。これを解決する方法はありますか?

参考までに: 「Hibernate の人々がこれを完全に台無しにしてしまった」という理由でGenerationType.AUTO を使用するように指示されているこのページは知っていますが、あまり役に立たないステートメント以上のものはありません。

4

1 に答える 1

6

GenerationType.SEQUENCE を使用する場合、シーケンスを Hi/Lo シードとして使用しないように、「増分値」を 1 に指定する必要があるようです。

投稿した質問に対する最初の回答 (役立つ回答) では、@GeneratedValue アノテーションで "allocationSize=1" を指定する必要があることが説明されています。

新しい Hibernate リリースでは、代わりにhibernate.id.new_generator_mappings=trueHibernate プロパティで設定できます。ドキュメントを参照してください。

于 2011-01-05T22:54:44.517 に答える