0

我正在遍历对象列表并在每次循环后一次保存一个对象。我发现只有最后一个对象在使用 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}
4

3 回答 3

0

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

图书类:

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;
    }
}

存储库接口

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;
    }
}
于 2016-12-20T06:45:46.433 回答
0

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

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

于 2019-04-17T08:51:14.703 回答
0

对于那些有类似问题的人,我的错误是@Id列表中的每个项目都是相同的,所以我必须@Embeddable使用我想使用的主键来创建类是唯一的。然后@EmbeddedId在主实体对象的类上使用注释。

所以本质上对我来说发生的事情是它插入了第一个对象,但是因为其他对象的 id 完全相同,所以它被那个 id 更新了。这就是为什么我只会看到最后一个值。

于 2021-08-30T17:06:02.613 回答