0

オブジェクトのコレクションをデータベースに保存するために、以下の方法を使用しています。

public Collection save(Collection instances) {

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


        } catch (RuntimeException re) {

            throw re;
        }
        return instances;
    }

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

table_name から max(Primary Key ID) を選択

しかし、メソッドが 2 回目に実行されると、このクエリが実行されていません。休止状態がこの値をセッションのどこかに保存しているようです。

テーブルが別のプロセス (ストアド プロシージャまたは SQL など) によって更新された場合、上記のメソッドへの後続の呼び出しはすべて、ORA-00001: 一意の制約 (SCHEMANAME.PRIMARY_KEY_CONSTRAINT) 違反の例外で失敗します。JVM が再起動されると、Hibernate は最大 (主キー) 生成クエリを再度実行し、すべてが機能します。

メソッドが実行されるたびに(初回だけでなく)主キーの自動生成クエリが実行されるようにするために、誰かが私がする必要があることを手伝ってもらえますか。ありがとう。

4

1 に答える 1

1

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

別の戦略 (データベースの機能と好みに応じて、シーケンス、テーブル、ネイティブ) を選択します。

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

于 2012-04-16T21:56:02.503 に答える