JpaRepository не обновляет сущность - PullRequest
2 голосов
/ 04 июля 2019

Насколько я понял, метод 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'.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Полагаю, это может быть ограничение, специфичное для драйвера mysql, для типа примитива java int, когда мы используем его для идентификатора.Я предлагаю вам изменить тип codeId на тип объекта в штучной упаковке Integer.

@Id
@Column(name = "code_id")
private Integer codeId;

Таким образом, базовый режим гибернации может понять разницу между идентификатором null и не нулевымно 0 значащий идентификатор, когда он генерирует соответствующие запросы на обновление.

0 голосов
/ 05 июля 2019

Попробуйте добавить sequenceGenerator и GeneratedValue в столбец идентификатора.

@Data
@Entity
@Table(name = "REF_PERIOD")
public class PayRefPeriod {

@SequenceGenerator(name = "generator", sequenceName = "REF_PERIOD_ID_SEQ")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")
@Id
@Column(name = "code_id")
private int codeId;

@Column(name = "code_name", length = 254, nullable = false)
private String codeName;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...