Перевести в спящий режим дублирующуюся запись для первичного ключа

#mysql #hibernate

#mysql #спящий режим

Вопрос:

У меня есть следующий объект:

 @Entity
public class WeeklyCare {
@EmbeddedId
private WeeklyCareIdentifier weeklyCareIdentifier;

private Double practicalCare = 0d;

private Double personalCare = 0d;

private Double healthCare = 0d;

private Double rehabilitation = 0d;

private Boolean hospitalized;

private Double totalCare = 0d;
}
  

Это встроенный идентификатор:

 @Embeddable
public class WeeklyCareIdentifier implements Serializable {

@NotNull
@Size(max = 10, min = 10, message = "CPR must tbe exactly 10 characters")
private String cpr;

@NotNull
private Integer week;

@NotNull
private Integer year;
}
  

Вот соответствующий код, который я использую для вставки данных в базу данных:

 List<WeeklyCare> weeklyCareToSave = new ArrayList<>();
for(Citizen c : citizensAndSubCare.citizens){
    for(WeeklyCare wc : c.getWeeklyCare()){
        if(weeklyCareRepository.existsById(wc.getWeeklyCareIdentifier())){
weeklyCareRepository.updateWeeklyCareByIdentifier(wc.getPracticalCare(), wc.getPersonalCare(), wc.getHealthCare(),
                            wc.getRehabilitation(), wc.getTotalCare(), wc.getWeeklyCareIdentifier());
                } else {
                    weeklyCareToSave.add(wc);
                }
            }
        }
        weeklyCareRepository.saveAll(weeklyCareToSave);
  

Последняя строка с saveAll() методом вызвала эту ошибку:

 com.mysql.jdbc.exceptions.jdbc4.MySqlIntegrityConstraintViolationException: Duplicate entry "0123456789-1" for key "PRIMARY"
  

Это очень сбивает меня с толку по нескольким причинам:

  1. Ключ «0123456789» существует, но не с «-1» в конце. Я не уверен, откуда он это берет.

  2. Ключ, на который он жалуется, является cpr , но дубликаты этого столбца должны быть разрешены. Это должно вызывать ошибку, только если week и year также совпадают для строки.

  3. Я проверяю, существует ли уже строка с определенным WeeklyCareIdentifier ( cpr , week , year ) и вставляю новую, только если нет. В противном случае я обновлю существующую.

Я не уверен, но может "0123456789-1" означать cpr=0123456789 и week=1 ? Если это так, это имело бы некоторый смысл, потому что новые данные, которые я пытаюсь вставить, содержат запись с тем же cpr и week . Однако год отличается ( 2018 от 2019 ), поэтому это должно быть разрешено.

Есть идеи, почему это происходит? Спасибо.

Ответ №1:

Оказывается, моя база данных не отражала мой код гибернации (вероятно, потому, что у меня есть spring.jpa.hibernate.ddl-auto=update в application.properties ), поэтому первичный ключ для weekly_care таблицы был просто cpr и week поскольку я добавил year позже. Я думаю, мне придется удалить таблицу и позволить hibernate воссоздать ее.