2012-02-28 38 views
5

Phương pháp nào tốt nhất (hiệu suất khôn ngoan) để xóa một đối tượng nếu chỉ có id của nó.Hibernate Xóa đối tượng theo id

  1. HQL. Sẽ thực hiện HQL này tải đối tượng SessionContext vào bối cảnh persistence hibernate?

    for(int i=0; i<listOfIds.size(); i++){ 
        Query q = createQuery("delete from session_context where id = :id "); 
         q.setLong("id", id); 
         q.executeUpdate(); 
    } 
    
  2. Tải theo ID và xóa.

    for(int i=0; i<listOfIds.size(); i++){ 
        SessionContext session_context = (SessionContext)getHibernateTemplate().load(SessionContext.class, listOfIds.get(i)); 
        getHibernateTemplate().delete(session_context) ; 
    } 
    

Đây SessionContext là đối tượng ánh xạ tới session_context bảng. Hoặc, tất nhiên là có một cách tiếp cận hoàn toàn khác nhau và tốt hơn?

Trả lời

7

Trong số hai, đầu tiên là tốt hơn, nơi bạn sẽ tiết kiệm bộ nhớ. Khi bạn muốn xóa các thực thể và bạn có id với bạn, viết một HQL được ưa thích.

Trong bạn trường hợp có một lựa chọn thứ ba và tốt hơn,

Hãy thử dưới đây,

//constructs the list of ids using String buffer, by iterating the List. 
String idList = "1,2,3,....." 

Query q = createQuery("delete from session_context where id in (:idList) "); 
q.setString("idList", idList); 
q.executeUpdate(); 

Bây giờ nếu có 4 mục trong danh sách chỉ có một truy vấn sẽ bị sa thải, Trước đây sẽ là 4.

Lưu ý: - Để làm việc ở trên, session_context phải là một bảng độc lập.

+0

cảm ơn, một số mối quan tâm 1. idList của tôi có thể có khoảng 1000 id tại một thời điểm nhất định. đó có phải là một vấn đề n? 2. Khi thực hiện thao tác xóa trước tiên, nó sẽ thử tải tất cả các đối tượng SessionContext vào bối cảnh kiên trì để xóa và sau đó tiếp tục xóa? – mohit052

+0

Để xóa một đối tượng, bạn không cần tải chúng vào phiên. Nó cũng làm việc với 1000 mục, nhưng trước tiên hãy làm việc với nó sau đó thực hiện các cải tiến hiệu suất. – ManuPK

+0

cảm ơn. đã nhận nó :-D – mohit052

2

Bạn cũng nên cân nhắc lưu vào bộ nhớ cache - cấp độ đầu tiên (phiên) và bộ nhớ cache cấp thứ hai.

Tùy chọn đầu tiên có lẽ là tốt nhất nếu xóa chỉ là hoạt động đầu tiên hoặc duy nhất trong giao dịch.

Nếu bạn truy vấn một số đối tượng SessionContext thì hãy gọi HQL để xóa sau đó tất cả các đối tượng trong bộ nhớ cache truy vấn sẽ bị loại bỏ, vì hibernate không biết phải xóa gì. Đây không phải là trường hợp với cách tiếp cận thứ hai.

Nếu bạn sử dụng bộ nhớ cache cấp thứ hai thì nó thậm chí còn phức tạp hơn và phụ thuộc rất nhiều vào những gì bạn làm với các đối tượng SessionContext.

+1

xin vui lòng không mang ** caching ** ở đây, ** OP ** Chỉ muốn xóa các mục từ bảng sao lưu và không phải từ bộ đệm ẩn. Như bạn đã nói ** bộ nhớ cache cấp thứ hai sau đó nó thậm chí còn phức tạp hơn ** vì vậy tốt hơn không nên đến đó nếu có thể !. – ManuPK

+0

Không có bộ đệm ẩn cấp hai ở đây :-). Cảm ơn mọi thứ đã bị xóa. – mohit052

3

Btw, nói không với chuỗi xấu xí, có .setParameterList(), vì vậy:

List<Long> idList = Arrays.asList(1L, 2L, 3L); 

Query q = createQuery("delete from session_context where id in (:idList) "); 
q.setParameterList("idList", idList); 
q.executeUpdate(); 

cập nhật tôi phải cập nhật về vấn đề này, trong môi trường của chúng tôi, cuối cùng nó bật ra, rằng việc sử dụng setParameterList cho hiệu suất kém hơn nhiều, hơn là tạo một chuỗi thủ công và sử dụng setString như @ManuPK được đề xuất.

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