Java 在JPA中,如何保存更新记录并防止唯一密钥冲突?

Java 在JPA中,如何保存更新记录并防止唯一密钥冲突?,java,jpa,save,Java,Jpa,Save,如何在执行save()之前检查数据库中是否存在记录,因为在我的例子中,我有一个字段(不是@Id)是唯一键。在我的网站中,我有一个分为3步的表格: 步骤1:设置firstname、lastname后,用户单击“下一步”,这将生成一个save()=Insert,因为该用户是数据库中的新用户。是数据库中名为“FirstnameAndLastname”的列,它是唯一的键 步骤2:要求用户填写他的电子邮件,然后单击“下一步”:这是相同的第一步save(),下面是一个错误,表示发生了唯一约束冲突 我理解

如何在执行
save()
之前检查数据库中是否存在记录,因为在我的例子中,我有一个字段(不是
@Id
)是
唯一键。在我的网站中,我有一个分为3步的表格:

  • 步骤1:设置firstname、lastname后,用户单击“下一步”,这将生成一个
    save()
    =Insert,因为该用户是数据库中的新用户。是数据库中名为“FirstnameAndLastname”的列,它是唯一的键
  • 步骤2:要求用户填写他的电子邮件,然后单击“下一步”:这是相同的第一步
    save()
    ,下面是一个错误,表示发生了唯一约束冲突
我理解,从步骤1开始,设置了unique键,在步骤2中,我尝试使用相同的unique再次写入,那么如何使seconde
save()
成为更新

这是我的实体:

@Entity
@Table(name = "student")
public class Student implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@Column(name = "firstname")
private String firstname;

 @Column(name = "lastname")
private String lastname;

@Column(name = "firstAndLastname")
private String firstLastname;

 // other columns + setter and getters etc
这是我的保存()

@覆盖
公共学生储蓄(学生新闻学生){
return studentRepository.save(newStudent);
}
@凌驾
@交易的
public void save(列出学生、字符串firstname、字符串lastname){
学生。forEach(新闻学生->{
newStudent.setFirstLastname(firstname+lastname);//连接以生成唯一键
保存(新闻学生);
});
}

我看到很多答案都说,我们应该在保存之前先获取(找到)学生,怎么做?

让数据库自动增加您的id's@Stultuske是的,事实上,我忘了复制/跳过此部分,我正在编辑我的帖子唯一键由firstname和lastname组成,我所说的id不是实体上的@id,但是我们假设唯一的密钥是firstname+lastname也许这会有帮助,
@Override
public Student save(Student newStudent) {
    return studentRepository.save(newStudent);

}

@Override
@Transactional
public void save(List<Student> students, String firstname, String lastname) {
    students.forEach(newStudent-> {
        newStudent.setFirstLastname(firstname+lastname); // concatenation to make the unique key
        save(newStudent);
    });
}