У меня есть следующая сущность:
@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"
Это меня очень смущает по нескольким причинам:
Ключ "0123456789" существует, но не с "-1" в конце. Я не уверен, откуда он это взял.
Ключ, на который он жалуется, - cpr
, но дубликаты этого столбца должны быть разрешены. Это должно вызвать ошибку, только если week
и year
также одинаковы для строки.
Я проверяю, существует ли уже строка с определенным WeeklyCareIdentifier
(cpr
, week
, year
), и только добавляю новую, если нет. В противном случае я буду обновлять существующий.
Я не уверен, но может ли "0123456789-1"
означать cpr=0123456789
и week=1
? Если это так, это будет иметь небольшой смысл, потому что новые данные, которые я пытаюсь вставить, содержат запись с теми же cpr
и week
. Однако год отличается (2018
от 2019
), поэтому его следует разрешить.
Есть идеи, почему это происходит? Спасибо.