2013-07-13 11 views
8

私はSpring MVCには新しく、JPAではあまり考えられません。私がしたいのは、リストをループしてDAOで更新を呼び出すときに、レコードのリストとそのうまくいっているものを更新することだけです。JPA Spring MVCでのHibernateの一括/バッチ更新

しかし、私は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);   
    } 

は、それも可能です。私はできるだけ多くの説明を得ると本当に感謝します。

ありがとうございました

答えて

5

JPA経由で複数の行を更新する標準的な方法です。 spring-data-jpaは、save(Iterable<T> items)がカバーの下のIteratorにループするだけです。 hereの別の質問は、オプションについては非常にうまく答えていますが、要するに、正しい方法で、更新ステートメントを自分で策定して実行することができます。

update: 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

  • またはあなたがあなたのsave(Iterable<Entity> entities)方法に@Transactionalアノテーションを使用することができます。トランザクションコンテキストでトランザクションアノテーションがサポートされていることを確認してください
+0

トランザクションでループを実行し、エンドコールをコミットするとどうなりますか?どのような違いがありますか。あなたはちょうど – user22197

+0

を説明してくださいこれは春のバッチを使用するか、またはprocから出るのは良いアイデアですか? – user22197

+0

がSpring-Batchの部分に答えるには、呼び出し元に同期応答を行う必要がありますか? –

関連する問題