2012-04-16 21 views
0

私は以下の方法を使用して、オブジェクトのコレクションをデータベースに保存しています。HibernateテンプレートSaveOrUpdateALL主キー自動生成

public Collection save(Collection instances) { 

     try { 
      this.getHibernateTemplate().saveOrUpdateAll(instances); 
      this.getHibernateTemplate().flush(); 


     } catch (RuntimeException re) { 

      throw re; 
     } 
     return instances; 
    } 

インスタンスの主キーは、HibernateTemplateによって自動的に生成されます。 JVMの起動後、このメソッドが初めて呼び出されると、Hibernateは以下のクエリを実行してインスタンスで使用されるMax主キーを取得します。

選択最大(主キーID)TABLE_NAME

しかし、メソッドが実行される2回目以降、私はこのクエリが実行されて表示されません。 hibernateがこの値をセッションのどこかに格納するように見えます。

これで、テーブルが別のプロセス(ストアド・プロシージャまたはSQLと言います)で更新されると、上記のメソッドへの呼び出しはすべて失敗し、ORA-00001:一意制約(SCHEMANAME.PRIMARY_KEY_CONSTRAINT)違反例外が発生します。 JVMが再起動されると、Hibernateはmax(Primary Key)生成クエリを再度実行し、すべてが機能します。

プライマリキーの自動生成クエリが、メソッドが実行されるたびに(初めてではなく)実行されていることを確認するために、必要なものを手伝ってもらえますか?ありがとう。

答えて

1

おそらく、増分ジェネレータが選択されています。増分ジェネレータは、最大値をメモリに格納してからインクリメントします。この戦略は、複数のプロセスがデータベースにアクセスしている場合(つまり、ほとんどの場合)は適切ではありません。

(データベースの機能と設定に応じて、シーケンス、テーブル、ネイティブ)を選択してください。

詳細はhttp://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-id-generatorを参照

+0

このプロパティはどこに設定されていますか?これはHibernate設定プロパティ内にありますか?ご協力いただきありがとうございます。私は広範囲にHibernateを使用していませんが、あなたが提供したリンクは参考になります。 – Ravi

+0

私は、Hibernateテーブルマッピング設定ファイルでid-generatorを見つけました。しかし、インクリメント以外のものに変更すると、IDジェネレータをインスタンス化できないというHibernate Mapping例外がスローされます。 Ravi

関連する問題