MongoDB 存储库 save() 执行插入而不是更新

时间:2021-07-12 07:51:44

标签: java spring mongodb

我正在用 spring 和 mongodb 编写一个 PUT 请求 API。但是 save() 插入一个新对象而不是更新当前对象。

@Document("Test")
public class Expense {

    @Field(name = "name")
    private String expenseName;
    @Field(name = "category")
    private ExpenseCategory expenseCategory;
    @Field(name = "amount")
    private BigDecimal expenseAmount;

    public Expense( String expenseName, ExpenseCategory expenseCategory, BigDecimal expenseAmount) {
        this.expenseName = expenseName;
        this.expenseCategory = expenseCategory;
        this.expenseAmount = expenseAmount;
    }

    public String getExpenseName() {
        return expenseName;
    }

    public void setExpenseName(String expenseName) {
        this.expenseName = expenseName;
    }

    public ExpenseCategory getExpenseCategory() {
        return expenseCategory;
    }

    public void setExpenseCategory(ExpenseCategory expenseCategory) {
        this.expenseCategory = expenseCategory;
    }

    public BigDecimal getExpenseAmount() {
        return expenseAmount;
    }

    public void setExpenseAmount(BigDecimal expenseAmount) {
        this.expenseAmount = expenseAmount;
    }
}

这是我的复习课

public interface ExpenseRepository extends MongoRepository<Expense, String> {
}

这是我的服务类,它显示了如何更新类。

@Service
public class ExpenseService {
    private final ExpenseRepository expenseRepository;

    public ExpenseService(ExpenseRepository expenseRepository) {
        this.expenseRepository = expenseRepository;
    }

    public void updateExpense(String id, Expense expense){
        Expense savedExpense = expenseRepository.findById(id)
                .orElseThrow(() -> new RuntimeException(
                        String.format("Cannot Find Expense by ID %s", id)));

        savedExpense.setExpenseName(expense.getExpenseName());
        savedExpense.setExpenseAmount(expense.getExpenseAmount());
        savedExpense.setExpenseCategory(expense.getExpenseCategory());

        expenseRepository.save(savedExpense);
    }
}

这是我的控制器

@RestController
@RequestMapping("/api/expense")
public class ExpenseController {

    private final ExpenseService expenseService;

    public ExpenseController(ExpenseService expenseService) {
        this.expenseService = expenseService;
    }
    @PutMapping("/{id}")
    public ResponseEntity<Object> updateExpense(@PathVariable String id, @RequestBody Expense expense){
        expenseService.updateExpense(id, expense);
        return ResponseEntity.ok().build();
    }
}

如 mongodb compass 所示,mongodb 自动为每个对象生成一个 _id 字段。所以我没有定义 id 字段或使用 @id 注释来定义集合的主字段。然而,在服务类中,expenseRepository.findById(id) 检索所需的对象并更新它。为什么 save() 执行插入而不是更新?非常感谢。 enter image description here

1 个答案:

答案 0 :(得分:1)

JPA 找不到现有条目,因为未设置 id 字段 id。您需要添加一个 id 字段并将生成类型设置为自动。

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int id;
相关问题