abarazal:
私の知る限りundestoodとして、JpaRepositoryはsave()メソッドは、データベース内の私のエンティティを更新する必要があります。
INTと主キーであるcode_id、およびcode_name、VARCHARです:私は、MySQLのテーブルが2つのだけの列でREF_PERIODと呼ばれています。
これが私のエンティティです。
@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方法は、(MySQLデータベース内のID 0がある)私のエンティティを更新することを期待:java.sql.SQLIntegrityConstraintViolationException:キーの重複エントリーは「0」「PRIMARY」。
私が間違って何をやっていますか?
ヤウスデザイン:
私はJavaのプリミティブ型のことをMySQLドライバの具体的な制限であるかもしれないと仮定しint
、我々は、識別子のためにそれを使用しています。私はあなたがの種類を変更示唆codeId
その箱入りオブジェクト型にInteger
。
@Id
@Column(name = "code_id")
private Integer codeId;
こうして下地Hibernateは差理解できるヌル識別子とNOT NULLなく0が対応する更新クエリを生成する際に価値識別子。