2011-01-05 13 views
4

Iは、配列生成された主キーで定義されたエンティティを有します。 PostgreSQLのによるとHibernateは挿入

select last_value from id_key_seq; 

戻り

1603. 

私が作成した()、私は(無関係なものが出て編集した)私のログに次のように見ている。このエンティティのインスタンスを永続化するために行う


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 INSERTステートメントが参照値1554ではなく、を使用する必要があります(1604(SequenceStructureから返された値に基づいて)。 Hibernateはどこから1554を取得しましたか?

私には見えます。Hibernateにはバグがあります。SequenceStructureは正しい次の値を知っていますが、使用されていません。どのようにこれを解決するためのアイデア?

FYI:私はthis page, which says to use GenerationType.AUTOを知っています。「Hibernateの人々はこれを完全に混乱させました」だからこそ、それほど役に立ちません。

答えて

5

GenerationType.SEQUENCEを使用している場合は、Hi/Loシードとしてシーケンスを使用しないようにするには、「インクリメント値」を1に設定する必要があります。

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

新しいHibernateリリースでは、代わりにhibernate.id.new_generator_mappings=trueをHibernateプロパティに設定できます。 the docsを参照してください。

+1

ありがとう@araqnid、allocationSizeを1に設定すると動作しますが、このアプローチが「良い習慣」ではないという意見が不思議です。 – Jay

+2

allocationSizeを1に設定すると縮退し、HiLoスタイルのジェネレータが通常のシーケンスジェネレータとして機能します。 OTOH、それはあなたが必要なものなので、それを使用してください。 Hibernate 3.5のコードを見ると、割り振りサイズはオプティマイザの実装を選択するために使用されるので、現在はうまく処理されています。 – araqnid

+0

私の意見では、Hibernateチームはこれの実装を考え直す必要があります。それは混乱し、不必要にそうです。 allocationSizeを1に設定するのは私が必要としていたものですが、PostgreSQLのSEQUENCEのデフォルトではないはずです。 – Jay

関連する問題