2016-04-20 21 views
5

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.

+0

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

+0

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). –

+0

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

Trả lời

2

Bạn đang sử dụng giao dịch cơ sở dữ liệu để đăng ký tất cả các câu lệnh của bạn, nhưng tôi nghĩ bạn muốn sử dụng batch updates.

Chỉ cần thêm thuộc tính cấu hình sau:

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

Mặc dù vậy, tôi nghĩ rằng bạn nên sử dụng Hibernate để quản lý chèn/cập nhật/xóa báo cáo, vì bạn chỉ nên tập trung vào entity state transitions. Các dirty checking mechanism có thể tự động phát hiện các thực thể đã được sửa đổi, và Hibernate có thể tạo ra các báo cáo cập nhật cho bạn, đó là thuận tiện hơn nhiều.

Các vấn đề liên quan