2013-07-13 51 views
8

Tôi mới làm quen với Spring MVC và cũng không có nhiều ý tưởng với JPA. tất cả những gì tôi muốn làm là cập nhật danh sách các bản ghi và hoạt động tốt của nó khi tôi lặp qua danh sách và gọi cập nhật trên DAO.Cập nhật hàng loạt/cập nhật hàng loạt JPA Hibernate trong Spring MVC

Nhưng tôi không muốn thực hiện 100 thao tác cập nhật/chèn hoặc các chuyến đi vòng DB.

thể bất kỳ một xin vui lòng chỉ cho tôi làm thế nào để cập nhật khoảng 100 hồ sơ với bản cập nhật hàng loạt thay vì làm như sau:

Controller: 
    List<MyEntity> list = form.getList(); 
    for(MyEntity e : list){ 
     dao.update(e); 
    } 

Dao: 
    public T update(T entity){ 
     entityManager.merge(entity);   
    } 

Có thể, nếu ai đó có thể cung cấp cho tôi một cách đơn giản để thực hiện cập nhật hàng loạt. Tôi thực sự đánh giá cao nếu tôi nhận được nhiều giải thích nhất có thể.

Cảm ơn

Trả lời

5

những gì bạn có là cách tiêu chuẩn cập nhật nhiều hàng thông qua JPA. sự kiện spring-data-jpa chỉ hiển thị save(Iterable<T> items) các vòng lặp trên Iterator dưới nắp. here 's một câu hỏi khác được trả lời rất độc đáo trên các tùy chọn, nhưng trong ngắn hạn, bạn đang trên con đường bên phải với thay thế được để xây dựng và thực hiện các báo cáo cập nhật chính mình.

cập nhật: thực hiện trong một giao dịch duy nhất có thể tăng hiệu suất khi bạn chỉ có phí giao dịch một lần. bạn cũng nhận được kịch bản nếu một trong các bản cập nhật không thành công, bất kỳ bản cập nhật nào trước đây cũng được khôi phục. (vì vậy, bạn có thể mất tất cả 'công việc' từ các bản cập nhật trước đó - bạn có thể hoặc không muốn điều đó)

cũng phải biết loại quản lý giao dịch bạn đang sử dụng (ví dụ JTA hoặc JPA) và triển khai JPA (ví dụ: Hibernate) là đôi khi chúng không chơi đẹp cùng nhau.

vì vậy, trong mã DAO của bạn, bạn có thể muốn thực hiện việc này;

  • thêm một tình trạng quá tải update(Iterator<Entity> entities) đang
  • trong mã mà làm điều gì đó như sau;

    entityManager.getTransaction().begin();//start the transaction

    for (Entity entity : entities) {

    entityManager.merge(entity);//update an entity 
    

    }

    entityManager.getTransaction().commit();//complete the transaction

  • hoặc bạn có thể sử dụng @Transactional chú thích về phương pháp save(Iterable<Entity> entities) của bạn. đảm bảo bạn có hỗ trợ chú thích giao dịch trong Ngữ cảnh mùa xuân quá
+0

Điều gì xảy ra nếu tôi thực hiện vòng lặp trong giao dịch và cuộc gọi kết thúc. nó đã tạo ra sự khác biệt gì. bạn có thể vui lòng chỉ giải thích – user22197

+0

là nó là một ý tưởng tốt để sử dụng hàng loạt mùa xuân cho điều này hoặc đi ra khỏi proc ??? – user22197

+0

để trả lời phần Spring-Batch, bạn có cần thực hiện phản hồi đồng bộ cho người gọi không? –

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