2016-04-20 5 views
5

Я использую 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; 
} 

Цените любую помощь.

+0

Я не вижу ничего плохого в вашем коде. Обновления будут происходить в базе данных один за другим, но не будут выполняться до тех пор, пока вы не назовете commit. Вы должны иметь возможность откатить транзакцию в любое время перед вызовом commit. Это довольно стандартный. Вы просто беспокоитесь о # раунде поездки в базу данных? – markwatsonatx

+0

Наличие одной транзакции не означает отправку нескольких обновлений в большой большой партии. И есть слишком много вещей, которые не выглядят правильно в вашем подходе (мне жаль, что это не то, что вы собираетесь делать в производственном коде). –

+0

Спасибо за ответы. Мне нужно перейти от session.update (item) к этому подходу, и есть снижение производительности. – Lasti

ответ

2

Вы используете транзакцию базы данных для регистрации всех своих заявлений, но я думаю, вы хотите использовать batch updates.

Просто добавьте следующую конфигурацию свойства:

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

Несмотря на это, я думаю, вы должны использовать Hibernate для управления вставки/обновления/удаления заявления, так как вы должны сосредоточиться только на entity state transitions. dirty checking mechanism может автоматически определять объекты, которые были изменены, а Hibernate может генерировать оператор обновления для вас, что намного удобнее.

Смежные вопросы