シーケンス生成の主キーで定義されたエンティティがあります。
@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 を使用するように指示されているこのページは知っていますが、あまり役に立たないステートメント以上のものはありません。