我正在用 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() 执行插入而不是更新?非常感谢。
答案 0 :(得分:1)
JPA 找不到现有条目,因为未设置 id 字段 id。您需要添加一个 id 字段并将生成类型设置为自动。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;