2016-04-20 10 views
5

私はORMレイヤーにHibernateを使用しています。 1つのトランザクションでHQLクエリのバッチを実行しようとしています(session.updateは使用できません)。 問題は、transaction.commit()がループの最後にあっても、更新クエリが1つずつ実行されることです。 1つのトランザクションで複数のHQLクエリを実行する方法はありますか?HQLクエリを使用したHibernateバッチ更新

public void updateItems() { 
    t = session.beginTransaction(); 
    for (int i = 0; i < itemList.size(); i++) { 
     Query q = createUpdateQuery(session, itemList.get(i));  
     q.executeUpdate(); //updating one by one, and not waiting for transaction commit 
    } 
    t.commit(); 
} 



Query createUpdateQuery(Session session, Item item) { 
    Query q = session.createQuery(
       "Update Item i set i.notes=:notes, i.time=:time, i.counter=:counter, i.status=:status Where i.id=:id and i.time=:time"); 

    q.setParameter("time", item.getTime()); 
    q.setParameter("status", item.getStatus()); 
    q.setParameter("notes", item.getNotes()); 
    q.setParameter("id", item.getId()); 
    return q; 
} 

ありがとうございました。

+0

コードに間違いはありません。更新はデータベース上で1つずつ発生しますが、コミットを呼び出すまでコミットされません。コミットを呼び出す前に、いつでもトランザクションをロールバックすることができます。これはかなり標準的です。あなたはデータベースへの往復回数について心配していますか? – markwatsonatx

+0

1つのトランザクションを持つことは、大きなビッグバッチで複数の更新を送信することを意味しません。そして、あなたのアプローチを正しく見ていないものが多すぎます(私はあなたがプロダクションコードでやっていることを望んでいます)。 –

+0

お返事ありがとうございます。 session.update(item)からこのアプローチに変更する必要があり、パフォーマンスが低下します。 – Lasti

答えて

2

データベーストランザクションを使用してすべてのステートメントを登録していますが、batch updatesを使用すると思います。

ただ、次の構成プロパティを追加:それでも

<property name="hibernate.jdbc.batch_size" value="10"/> 

を、私はあなただけentity state transitionsに焦点を当てるべきであるとして、あなたは、文を削除/挿入/更新を管理するためにHibernateを使うべきだと思います。 dirty checking mechanismは、変更されたエンティティを自動的に検出し、Hibernateは更新ステートメントを生成することができます。これははるかに便利です。

関連する問題