Объект Jpa дублирует ту же запись и нарушает уникальный ключ

#java #jpa #entity #constraintviolationexception

#java #jpa #объект #constraintviolationexception

Вопрос:

Я использую Jpa, на моем веб-сайте отображается форма в 3 шага, на каждом шаге я делаю save() много шагов :

  • Сначала save() будет создана запись A с первичным ключом id и другим уникальным ключом userId , данными в виде имени и фамилии
  • На шаге 2 пользователь вводит свой адрес, затем воспроизводится тот же первый save()

Но я вижу ошибку :

 ERROR: duplicate key value violates unique constraint "userId" XXXX already exists
 

Предполагается, что A save() делает update , если запись существует, но я отметил, что мои id приращения в каждом save() , как предотвратить это приращение?

вот моя сущность :

 @Table(name = "user", schema = "salesforce", uniqueConstraints = {
    @UniqueConstraint(columnNames = { "userId" }) })
 

Получатель общедоступного класса реализует Serializable {

 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);
 

Репозиторий

 @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);
    });
}
 

На каждом шаге воспроизводится то же save() самое, но сначала я получил сообщение об ошибке, в котором говорится, что я пытаюсь написать новый ligne с тем же идентификатором пользователя, и это создает нарушение дублирования

Эта повторная запись связана с тем, что Id увеличивается! почему?

Комментарии:

1. Я думаю, вы пытаетесь сохранить отдельный пользовательский объект, hibernate попытается сохранить объект, он не знает, что уже существует объект с таким же id , следовательно, он выдаст инструкцию insert с id , вам нужно сначала извлечь объект, а затем внести в него изменения.

2. Да, действительно @code_mechanic это означает, что выборка должна быть выполнена перед сохранением в моем репозитории? findAllById ?

3. Да, но извлекайте по идентификатору каждого пользователя, а затем обновляйте его состояние с помощью свойств вашего отдельного объекта, обновления с JPA немного сложны.

4. EntityManager.merge это упрощает, но иногда это не вариант.

5. Хотя сначала вам следует выполнить выборку, а затем обновить, но ваша проблема в другом, у вас есть ограничение userId , поэтому, пожалуйста, проверьте, не повторяется ли это значение для каждого пользователя, если вы добавляете нового пользователя, используя save метод каждый раз, тогда ваш код в порядке.