存储库接口在for循环中仅保存最后一个对象实例,而批量插入在保存之前更改对象

时间:2016-12-19 10:21:09

标签: java spring-boot spring-data spring-mongodb

我正在迭代一个对象列表,并在每个循环后一次保存一个对象。我发现只有在使用MongoRepository接口时才会保存最后一个对象。

例如

for(int i=0;i<=objectList.size();i++){
    repositoryInterface.save(objectList.get(i));
}

在这种情况下,当objectList中有大约3个对象时,只保存最后一个对象。

同样,如果使用repositoryInterface在一个查询中保存所有objectList, 说,repositoryInterface.save(objectList), 对于objectList中的所有三个对象,只保留objectList中最后一个对象的最后一个更改。 例如,

public class Book {
    private String bookName;
    private int bookNumber;
    //then getters and setters
}


List<Book> books = new ArrayList<>();
Book book0 = new Book();
book0.setBookName("Book0");
book0.setBookNumber(0);

books.add(book0);

Book book1 = new Book();
book1.setBookName("Book1");
book1.setBookNumber(1);

books.add(book1);

for(int i=0;i< books.size();i++){
    switch(i){
        case 0 :  
            books.get(0).setBookNumber(00);
            break;
        case 1 :
            books.get(1).setBookNumber(11);
            break;
        default:
            System.out.println("nothing per this example");
    }
}

repositoryInterface.save(books);

现在检查mongo数据库,插入的内容是

{bookName:"Book0",bookNumber:11},{bookName:"Book1",bookNumber:11} 

而不是

{bookName:"Book0",bookNumber:00},{bookName:"Book1",bookNumber:11}

2 个答案:

答案 0 :(得分:0)

如果修复了代码的一些基本问题,它可以正常工作。这是我试图重现该问题的代码,但运行没有问题(排除了包和import语句):

书类:

public class Book {
    private String bookName;
    private int bookNumber;

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public int getBookNumber() {
        return bookNumber;
    }

    public void setBookNumber(int bookNumber) {
        this.bookNumber = bookNumber;
    }
}

RepositoryInterface

public interface RepositoryInterface extends MongoRepository<Book, String>{

}

包含要执行的实际代码的Bean。在doSomething中使用任一方法,以便逐个处理书籍或作为单个列表处理。

@Component
public class RunCode {

    private final RepositoryInterface repositoryInterface;

    public RunCode(RepositoryInterface repositoryInterface) {
        this.repositoryInterface = repositoryInterface;
    }

    @PostConstruct
    public void doSomething() {
       // updateAsList();
        updateOneByOne();
    }

    private void updateOneByOne() {
        List<Book> books = createBookList();
        for(int i=0;i<books.size();i++){
            repositoryInterface.save(books.get(i));
        }
    }

    private void updateAsList() {
        List<Book> books = createBookList();

        for (int i = 0; i < books.size(); i++) {
            switch (i) {
                case 0:
                    books.get(0).setBookNumber(00);
                    break;
                case 1:
                    books.get(1).setBookNumber(11);
                    break;
                default:
                    System.out.println("nothing per this example");
            }
        }

        repositoryInterface.save(books);
    }

    private List<Book> createBookList() {
        List<Book> books = new ArrayList<>();
        Book book0 = new Book();
        book0.setBookName("Book0");
        book0.setBookNumber(0);

        books.add(book0);

        Book book1 = new Book();
        book1.setBookName("Book1");
        book1.setBookNumber(1);

        books.add(book1);
        return books;
    }
}

答案 1 :(得分:0)

您为什么不使用saveAll()而不是save()

saveAll()提供保存实体,输入中的所有列表。