Java Jpa实体相同的记录重复,并且存在唯一密钥冲突

Java Jpa实体相同的记录重复,并且存在唯一密钥冲突,java,jpa,entity,constraintviolationexception,Java,Jpa,Entity,Constraintviolationexception,我使用的是Jpa,我的网站分3步显示表单,在我进行的每个步骤中,save()分多个步骤: 第一个save()将创建一个记录a,其中包含一个主键id和另一个唯一键userId,数据为firstname和lastname 第2步是用户输入地址,然后播放相同的第一个save() 但我看到一个错误: ERROR: duplicate key value violates unique constraint "userId" XXXX already exists 如果记录存在,

我使用的是Jpa,我的网站分3步显示表单,在我进行的每个步骤中,
save()
分多个步骤:

  • 第一个
    save()
    将创建一个记录
    a
    ,其中包含一个主键
    id
    和另一个唯一键
    userId
    ,数据为firstname和lastname
  • 第2步是用户输入地址,然后播放相同的第一个
    save()
但我看到一个错误:

ERROR: duplicate key value violates unique constraint "userId" XXXX already exists
如果记录存在,
save()
应该进行
更新
,但是我注意到我的
id
在每次
save()
中都会增加,如何防止这种增加

这是我的实体:

@Table(name = "user", schema = "salesforce", uniqueConstraints = {
    @UniqueConstraint(columnNames = { "userId" }) })
公共类实现了可序列化{

private static final long serialVersionUID = 1L;

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

 @Column(name = "userID")
private String userId;

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

@Column(name = "lastname")
private String lastname;
服务:

void save(List<User> users, String idDocument); // it can be same users with same idDocument
public Beneficiary save(Beneficiary newBeneficiary);
void save(列出用户,字符串idDocument);//可以是具有相同idDocument的相同用户
公共受益人储蓄(受益人新受益人);
存储库

@Override
public User save(User newUser) {
    return userRepository.save(newUser);
}

@Override
@Transactional
public void save(List<User> users, String idDocument) {
    users.forEach(newUser -> {
        newUser.setDocument(new Document());
        newUser.getDocument().setIDDocument(idDocument);
        save(newUser);
    });
}
@覆盖
公共用户保存(用户newUser){
返回userRepository.save(newUser);
}
@凌驾
@交易的
公共作废保存(列表用户,字符串idDocument){
users.forEach(newUser->{
setDocument(新文档());
newUser.getDocument().setIDDocument(idDocument);
保存(新用户);
});
}
在每一步中,都会播放相同的
save()
,但首先我得到一个错误,说我正在尝试使用相同的用户ID编写一个新的ligne,它会创建重复冲突


此重写是由于
Id
正在增加!为什么?

我认为,您正在尝试保存分离的用户对象,hibernate将尝试保存对象,它不知道已经有一个具有相同
Id
的对象,因此它将发出带有
Id
的insert语句,您需要首先获取该对象然后对其进行更改。是的,的确@code_mechanical这意味着应该在保存到我的存储库之前完成提取?findAllById?是的,但是通过每个用户的Id提取,然后用分离对象的属性更新其状态,更新对JPA来说有点困难。
EntityManager.merge
使它变得简单,但有时这并不是解决问题的方法选项。虽然您应该先获取然后更新,但您的问题不同,您对
用户ID
有限制,因此请检查该值是否对每个用户重复,如果您每次都使用
保存
方法添加新用户,则您的代码正常。