8

私はSpring MVCが初めてで、JPAについてもあまり考えていません。私がしたいのは、レコードのリストを更新し、リストをループして DAO で update を呼び出したときにうまく機能することだけです。

しかし、100回の更新/挿入操作やDBラウンドトリップを実行したくありません。

次の手順を実行する代わりに、バッチ更新で約 100 レコードを更新する方法を教えてください。

Controller:
    List<MyEntity> list = form.getList();
    for(MyEntity e : list){
        dao.update(e);
    }

Dao:
    public T update(T entity){
         entityManager.merge(entity);        
    }

誰かがバッチ更新を実行する簡単な方法を私に提供できれば、それは可能ですか? できるだけ多くの説明をいただければ幸いです。

ありがとう

4

1 に答える 1

5

あなたが持っているのは、JPAを介して複数の行を更新する標準的な方法です。カバーの下をループするだけのイベントspring-data-jpa 。オプションで非常にうまく答えられる別の質問がありますが、要するに、更新ステートメントを自分で作成して実行するという代替手段で正しい道を進んでいますsave(Iterable<T> items)Iterator

更新: トランザクションのオーバーヘッドが 1 回しかないため、単一のトランザクションで実行するとパフォーマンスが向上する場合があります。また、更新の 1 つが失敗した場合、以前の更新もロールバックされるというシナリオが得られます。(そのため、以前の更新からすべての「作業」を失う可能性があります-それが必要な場合とそうでない場合があります)

また、使用しているトランザクション マネージャーのタイプ (JTA や JPA など) と JPA 実装 (Hibernate など) について注意してください。

そのため、DAO コードでこれを行うことができます。

  • update(Iterator<Entity> entities)オーバーロードコードを追加する
  • そのコードでは、次のようなことを行います。

    entityManager.getTransaction().begin();//start the transaction

    for (Entity entity : entities) {

        entityManager.merge(entity);//update an entity
    

    }

    entityManager.getTransaction().commit();//complete the transaction

  • @Transactionalまたは、メソッドで注釈を使用できますsave(Iterable<Entity> entities)。Spring Context でもトランザクションアノテーションがサポートされていることを確認してください
于 2013-07-13T11:24:00.363 に答える