#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"
Это очень сбивает меня с толку по нескольким причинам:
-
Ключ «0123456789» существует, но не с «-1» в конце. Я не уверен, откуда он это берет.
-
Ключ, на который он жалуется, является
cpr
, но дубликаты этого столбца должны быть разрешены. Это должно вызывать ошибку, только еслиweek
иyear
также совпадают для строки. -
Я проверяю, существует ли уже строка с определенным
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 воссоздать ее.