4

関連するいくつかのタイプの数十万のエンティティに対してバッチ プロセスを実行するプログラムを作成しています。私はもともと、永続化ごとに 1 つのトランザクションでこれを行っていました。これは非常に遅いように見えたので、 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.htmlに記載されている方法で、より長いトランザクションと時折のフラッシュを使用して、やや単純なバッチ更新を試みました。+クリアします。固有のフィールド制約があるため、一部のエンティティ タイプで ConstraintViolationException が発生しています。ただし、既存のインスタンスを確認する方法がわかりません。現在、衝突をリストする基準がありますが、同じトランザクション内で saveOrUpdated したエンティティが返されないようです。

作成された例が役立つかもしれません:
エンティティ Family, Person, Name
Family has many Persons (One to Many)
Persons は多くの名前を持ち、異なる Person は同じ Name を持つことができます。(多対多)

私の更新には、家族とその人物と名前の永続化が含まれていますが、名前を重複排除する方法がわかりません (データベース内の既存の名前または同じ更新バッチ内の別の名前と衝突する可能性があります)。休止状態の外で新しいエンティティの一意の制約フィールドを追跡することはできましたが、これはおそらく必要ないと思いました。データベースとコミットされていない変更の両方で重複をチェックする組み込みの方法はありますか? constraintviolationexception を使用した Hibernate バッチ更新を見ましたが、通常のコードパスで例外を使用することは好きではありません。ありがとうございます。

4

1 に答える 1

2

短い答え:いいえ。バッチ操作の場合、Hibernate は生成された ID を追跡しないため、使用してNameいない限り、ID ではなく名前に基づいてクエリを実行するため、それぞれのデータベースにアクセスする必要があります。いくつかのクエリキャッシュ(あなたの場合は難しいと思います)。

私が提案するのは、これを 2 段階 (3 段階?) のプロセスで行うことです。最初に、すべてのNameオブジェクトをバッチ挿入します。次に、Hibernate 自体を使用してそれらをすべてロードし、Map. 次に、他のデータをName永続化して、永続化されていないにリンクしPersonます。もちろん、名前と同じくらい多くのメモリが必要になります:-) しかしName、とにかく、なぜ別のエンティティとして保持しているのですか?

于 2012-06-25T10:29:28.693 に答える