18

私の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>
4

3 に答える 3

20

これは文書化されていませんが、PKがタイプまたは:の場合、実際にidentityPostgreSQLでジェネレーターを使用できます。SERIALBIGSERIAL

<id name="id" column="user_id" type="java.lang.Long">
     <generator class="identity"/>
</id>

この背景については、 HB-875およびHHH-1675を参照してください。

于 2010-08-08T17:42:12.190 に答える
4

私が読んだものから:

<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>

シーケンスジェネレーターは、次のように説明される非挿入POIDジェネレーターに分類されます。

非挿入POIDジェネレーターは、新しいアプリケーションに最適なオプションです。これらのジェネレーターにより、NHibernateはオブジェクトのデータをデータベースに書き込むことなく永続オブジェクトにIDを割り当てることができ、NHibernateはビジネストランザクションが完了するまで書き込みを遅らせることができ、データベースへのラウンドトリップを減らすことができます。

IDジェネレーターが挿入後のPOIDジェネレーターグループである場合:

挿入後のPOIDジェネレーターでは、IDを生成するために、データをデータベースに永続化する必要があります。これにより、NHibernateの動作が非常に微妙に変化し、一部のパフォーマンス機能が無効になります。そのため、これらのPOIDジェネレーターの使用は強くお勧めしません。これらは、他のアプリケーションがこの動作に依存している既存のデータベースでのみ使用する必要があります。

引用はNHibernate3.0クックブックから取られました。

于 2011-08-12T07:53:57.830 に答える
1

以下を試してみましたが、うまくいきました:

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
于 2010-08-08T09:46:06.687 に答える