我有以下实体:
@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;
}
这是嵌入式ID:
@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
),因此应该允许。
有什么想法为什么会这样?谢谢。
答案 0 :(得分:0)
原来我的数据库没有反映我的休眠代码(可能是因为我在spring.jpa.hibernate.ddl-auto=update
中有application.properties
),所以用于
weekly_care
表只是cpr
和week
,因为我后来添加了year
。我想我将不得不删除表并让休眠重新创建它。