Postgresシリアル/ビッグセリアル列用の適切なHibernate IDジェネレーター?
-
26-09-2019 - |
質問
私のpostgreSQLテーブルにはタイプのIDがあります bigserial
, 、つまり、行が挿入された時に生成されます(したがって、ID列の値はで提供されません INSERT
声明)。適切な価値を見つけるのが困難です <generator class="...">
XMLマッピングファイルの属性。
以下のコードは、私が見つけた中で最も近いことですが、それはPostgresに最も近いと思われますが、それでも実行中です SELECT nextval(...)
挿入する前のシーケンスで(およびIDフィールドの値を挿入に明示的に含める)。 HibernateにIDフィールド値をまったく含めないようにしたいだけで、Postgresが値自体を生成する仕事をすることができます。
<id name="id" column="id" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>
他のヒント
私が読んだものから:
<id name="id" column="id" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>
より速く動作するはずです:
<id name="id" column="id" type="java.lang.Long">
<generator class="identity" />
</id>
シーケンスジェネレーターはに落ちます 非挿入ポイドジェネレーター このように説明されています:
非Insert Poidジェネレーターは、新しいアプリケーションに最適なオプションです。これらのジェネレーターにより、NhibernateはオブジェクトのデータをTheDatabaseに書き込むことなく、保持オブジェクトにIDを割り当てることができ、Nhibernateはビジネストランザクションが完了するまで書き込みを遅らせ、データベースへの往復を減らします。
IDジェネレーターはそうです ポストインターのポイドジェネレーター グループ:
ポストインターのポイドジェネレーターは、IDを生成するためにデータをデータベースに持続させる必要があります。 これにより、Nhibernateの動作が非常に微妙な方法で変化し、いくつかのパフォーマンス機能が無効になります。そのため、これらのPoidジェネレーターの使用は強く落胆しています! 他のアプリケーションがこの動作に依存している既存のデータベースでのみ使用する必要があります。
引用は、Nhibernate 3.0 Cookbookから取られました。
フォローしてみましたが、うまくいきました:
<id name="id" column="id" type="long" unsaved-value="null" >
<generator class="sequence">
<param name="sequence">my_sequence_name</param>
</generator>
</id>