Насколько я понял, метод save () JpaRepository должен обновить мою сущность в базе данных.
У меня есть таблица в MySQL с именем REF_PERIOD только с двумя столбцами: code_id, который является INT и первичным ключом, и code_name, который является VARCHAR.
Это моя сущность:
@Data
@Entity
@Table(name = "REF_PERIOD")
public class PayRefPeriod {
@Id
@Column(name = "code_id")
private int codeId;
@Column(name = "code_name", length = 254, nullable = false)
private String codeName;
}
Мой репозиторий:
@Repository
public interface PayRefPeriodRepository extends JpaRepository<PayRefPeriod, Integer> {
}
и контроллер:
@Slf4j
@RestController
@RequestMapping("/api")
public class PayRefPeriodController {
@Autowired
private PayRefPeriodRepository payRefPeriodRepository;
// Get all pay reference periods
@GetMapping("/payrefperiods")
public List<PayRefPeriod> getAllPayRefPeriod() {
return payRefPeriodRepository.findAll();
}
// Create a new pay reference period
@PostMapping("/payrefperiods")
public PayRefPeriod createPayRefPeriod(@Valid @RequestBody PayRefPeriod payRefPeriod) {
return payRefPeriodRepository.save(payRefPeriod);
}
// Get a single pay reference period
@GetMapping("/payrefperiods/{id}")
public PayRefPeriod PayRefPeriod(@PathVariable(value = "id") int payRefPeriodId) {
return payRefPeriodRepository.findById(payRefPeriodId)
.orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));
}
// Update a pay reference period
@PutMapping("/payrefperiods/{id}")
public PayRefPeriod updatePayRefPeriod(@PathVariable(value = "id") int payRefPeriodId,
@Valid @RequestBody PayRefPeriod payRefPeriodDetails) {
PayRefPeriod payRefPeriod = payRefPeriodRepository.findById(payRefPeriodId)
.orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));
payRefPeriod.setCodeName(payRefPeriodDetails.getCodeName());
log.debug(payRefPeriod.toString());
return payRefPeriodRepository.save(payRefPeriod);
}
// Delete a pay reference period
@DeleteMapping("/payrefperiods/{id}")
public ResponseEntity<?> deletePayRefPeriod(@PathVariable(value = "id") int payRefPeriodId) {
PayRefPeriod payRefPeriod = payRefPeriodRepository.findById(payRefPeriodId)
.orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));
payRefPeriodRepository.delete(payRefPeriod);
return ResponseEntity.ok().build();
}
}
Я ожидаю, что метод updatePayRefPeriod обновит мою сущность (у которой Id 0 в базе данных MySQL), однако он выдает исключение: java.sql.SQLIntegrityConstraintViolationException: повторяющаяся запись '0' для ключа 'PRIMARY'.
Что я делаю не так?