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;
}
ありがとうございました。
コードに間違いはありません。更新はデータベース上で1つずつ発生しますが、コミットを呼び出すまでコミットされません。コミットを呼び出す前に、いつでもトランザクションをロールバックすることができます。これはかなり標準的です。あなたはデータベースへの往復回数について心配していますか? – markwatsonatx
1つのトランザクションを持つことは、大きなビッグバッチで複数の更新を送信することを意味しません。そして、あなたのアプローチを正しく見ていないものが多すぎます(私はあなたがプロダクションコードでやっていることを望んでいます)。 –
お返事ありがとうございます。 session.update(item)からこのアプローチに変更する必要があり、パフォーマンスが低下します。 – Lasti