Я использую Hibernate для своего слоя ORM. Я пытаюсь запустить пакет запросов HQL в одной транзакции (я не могу использовать session.update). Проблема в том, что даже transaction.commit() находится в конце цикла, запросы обновления запускаются один за другим. Есть ли способ запустить несколько запросов HQL в одной транзакции?Пакетное обновление Hibernate с использованием запроса HQL
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;
}
Цените любую помощь.
Я не вижу ничего плохого в вашем коде. Обновления будут происходить в базе данных один за другим, но не будут выполняться до тех пор, пока вы не назовете commit. Вы должны иметь возможность откатить транзакцию в любое время перед вызовом commit. Это довольно стандартный. Вы просто беспокоитесь о # раунде поездки в базу данных? – markwatsonatx
Наличие одной транзакции не означает отправку нескольких обновлений в большой большой партии. И есть слишком много вещей, которые не выглядят правильно в вашем подходе (мне жаль, что это не то, что вы собираетесь делать в производственном коде). –
Спасибо за ответы. Мне нужно перейти от session.update (item) к этому подходу, и есть снижение производительности. – Lasti