我在我的ORM层使用Hibernate。 我试图在一个事务中运行一批HQL查询(我不能使用session.update)。 问题是即使transaction.commit()在循环结束时,更新查询也会逐个运行。 有没有办法在一个事务中运行多个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 :(得分:2)
您正在使用数据库事务来注册所有语句,但我认为您要使用batch updates。
只需添加以下配置属性:
<property name="hibernate.jdbc.batch_size" value="10"/>
即便如此,我认为您应该使用Hibernate来管理插入/更新/删除语句,因为您应该只关注entity state transitions。 dirty checking mechanism可以自动检测已修改的实体,Hibernate可以为您生成更新语句,这样更方便。