Tôi đang sử dụng Hibernate cho lớp ORM của mình. Tôi cố gắng chạy hàng loạt truy vấn HQL trong một giao dịch (Tôi không thể sử dụng session.update). Vấn đề là ngay cả transaction.commit() là ở cuối vòng lặp, các truy vấn cập nhật chạy từng cái một. Có cách nào để chạy nhiều truy vấn HQL trong một giao dịch không?Cập nhật hàng loạt Hibernate sử dụng Truy vấn 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;
}
Đánh giá cao sự trợ giúp.
Tôi không thấy bất kỳ điều gì rõ ràng là sai với mã của bạn. Các cập nhật sẽ xuất hiện trên cơ sở dữ liệu từng cái một, nhưng sẽ không được cam kết cho đến khi bạn gọi cam kết. Bạn sẽ có thể khôi phục giao dịch bất kỳ lúc nào trước khi gọi cam kết. Đây là tiêu chuẩn khá. Bạn có lo lắng về số lần đi vòng đến cơ sở dữ liệu không? – markwatsonatx
Có một giao dịch không có nghĩa là gửi nhiều cập nhật trong lô hàng lớn. Và đơn giản là có quá nhiều thứ không đúng trong cách tiếp cận của bạn (tôi ước nó là những gì bạn sẽ làm trong mã sản xuất). –
Cảm ơn bạn đã trả lời. Tôi cần thay đổi từ session.update (mục) sang phương pháp này và có hiệu suất giảm. – Lasti