#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
метод каждый раз, тогда ваш код в порядке.