存储库接口在 for 循环中仅保存最后一个对象实例,并且在保存之前批量插入更改对象
Repository interface saves only last object instance when in a for loop and bulk insert changes objects before saving
我正在遍历对象列表并在每次循环后一次保存一个对象。我发现当使用 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}
如果修复了代码的一些基本问题,它就可以正常工作。这是我试图重现该问题但运行没有问题的代码(不包括包和导入语句):
这本书 class:
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;
}
}
为什么不使用 saveAll()
而不是 save()
?
saveAll()
提供保存实体,输入的所有列表。
对于那些有类似问题的人,我的错误是列表中每个项目的 @Id
是相同的,所以我不得不创建 @Embeddable
class我想使用的主键是唯一的。然后在主实体对象的 class 上使用 @EmbeddedId
注释。
所以基本上对我来说发生的事情是插入第一个对象,但是因为其他对象的 ID 完全相同,它由那个 ID 更新。这就是为什么我只会看到最后一个值。
我正在遍历对象列表并在每次循环后一次保存一个对象。我发现当使用 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}
如果修复了代码的一些基本问题,它就可以正常工作。这是我试图重现该问题但运行没有问题的代码(不包括包和导入语句):
这本书 class:
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;
}
}
为什么不使用 saveAll()
而不是 save()
?
saveAll()
提供保存实体,输入的所有列表。
对于那些有类似问题的人,我的错误是列表中每个项目的 @Id
是相同的,所以我不得不创建 @Embeddable
class我想使用的主键是唯一的。然后在主实体对象的 class 上使用 @EmbeddedId
注释。
所以基本上对我来说发生的事情是插入第一个对象,但是因为其他对象的 ID 完全相同,它由那个 ID 更新。这就是为什么我只会看到最后一个值。