Двойная запись гибернации для первичного ключа - PullRequest
0 голосов
/ 26 марта 2019

У меня есть следующая сущность:

@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 Ответ

0 голосов
/ 26 марта 2019

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

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