JpaRepositoryは、エンティティを更新しません

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が対応する更新クエリを生成する際に価値識別子。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=228802&siteId=1