Hibernateでは、セッションでsave
を呼び出す前に手動で@GeneratedValue
プロパティの値を生成することをスキップする方法がありますか?自動生成されたidプロパティを手動で設定する
私はインポート/エクスポート機能を構築しており、以前に作成したエクスポートからIDを保持したいと考えています。
Hibernateでは、セッションでsave
を呼び出す前に手動で@GeneratedValue
プロパティの値を生成することをスキップする方法がありますか?自動生成されたidプロパティを手動で設定する
私はインポート/エクスポート機能を構築しており、以前に作成したエクスポートからIDを保持したいと考えています。
デフォルトでは、Hibernateは値がすでに設定されている場合はオーバーライドしないので、すべてが期待どおりに動作するはずです。 AUTOを使用していないことを確認してください。
もっと複雑なロジックが必要な場合は、@GenericGeneratorをご覧ください。 https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-hibspec-identifier
@GeneratedValue
はid
がどのあなたはこの注釈がnull
/0
で適用している場合、それは戦略だ適用されます。
これは、id
フィールドを手動で割り当てた場合、@GeneratedValue
アノテーションがUSELESSであることを意味します。
問題は、@GeneratedValue
のデフォルト戦略(AUTO
)を使用していたことです。私が明示的にIDENTITY
を指定するように変更すると、それは機能します!
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
あなたがこの方法を使用する場合けれども... :-)
特に、間違った方言が指定されていると、AUTOは薄暗くなります。 –
実際、これはまだ動作しません。それは私のために新しいIDを生成します。 (私はこの場合HSQLDBを使用しています) –
私が使用しているHibernateのバージョンと関係があるのだろうかと思います。私はかなり古いものです:4.3.8 –
は、言うことが重要である理由私は本当に理解していない:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
そして、あなたが持っていませんあなたがデータベースに設定したIDはあなたのIDセットを無視し、データベースは新しいIDを作成します。つまり、空のデータベースがあり、user.setId(100L)
を設定して保存した場合、データベースでそれを見つけると、service.findById(100L)
はオブジェクトを検出しません。
興味深い...何らかの理由でIDを生成しようとしています。他の何かが正しく動作していない可能性があります。私は掘り続けます。 –
実際には、「あなたがAUTOを使用していないことを確認してください」という意味はどうですか?私はAUTOを使用しています... –
明示的に "IDENTITY"に設定すると、動作します。なぜ、私は理解していません... –