休眠重复输入主键

时间:2019-03-26 14:41:22

标签: mysql hibernate

我有以下实体:

@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"

这使我感到困惑,原因有几个:

  1. 键“ 0123456789”存在,但末尾没有“ -1”。我不确定它从哪里得到的。

  2. 它抱怨的密钥是cpr,但应允许重复使用此列。如果weekyear在一行中也相同,则只会导致错误。

  3. 我正在检查是否已存在具有特定WeeklyCareIdentifiercprweekyear)的行,并且仅在以下情况下插入新行:不。否则,我将更新现有的。

我不确定,但是"0123456789-1"是指cpr=0123456789week=1吗?如果是这样,那将有点意义,因为我要插入的新数据包含具有相同的cprweek的记录。但是,年份不同(20182019),因此应该允许。

有什么想法为什么会这样?谢谢。

1 个答案:

答案 0 :(得分:0)

原来我的数据库没有反映我的休眠代码(可能是因为我在spring.jpa.hibernate.ddl-auto=update中有application.properties),所以用于 weekly_care表只是cprweek,因为我后来添加了year。我想我将不得不删除表并让休眠重新创建它。