Я пытался обновить мою сущность следующим кодом:
Не комментированная версия (может быть более читабельной):
MyEntity entity = MyConverter.dtoToEntity(fooDto);
MyEntity existingEntity = this.repo.getEntityByNumber(entity.getNumber()).orElse(null);
existingEntity = entity;
this.entityManager.merge(existingEntity);
Вот закомментированная версия (чтобы увидеть, что я думал, покапишу это).
//this dto came from a RestController
MyEntity entity = MyConverter.dtoToEntity(fooDto);
//null would mean it is not existing
//getEntityByNumber selects an Entity by a given Number - the Number is a unique number but not the PK
MyEntity existingEntity = this.repo.getEntityByNumber(entity.getNumber()).orElse(null);
//update the found entity to the existing entity
existingEntity = entity;
//merge it to override the changes if existing or create a new one.
this.entityManager.merge(existingEntity);
Я получаю следующую ошибку:
2018-12-30 00:32:47.944 ERROR 18708 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'Test' for key 'UC_NUMBER'
Так что, похоже, он попытается создать новую запись, но есть существующая, почемуон сделал бы это?
Редактировать: Итак, чтобы уточнить, что я пытаюсь сделать:
Я получаю DTO (fooDto
) из REST-API, которыйв нем есть изменения, но он должен уже существовать в моей базе данных, и теперь я хотел бы сохранить эти изменения в этой записи базы данных.
Итак, я попытался использовать entityManager
для сохранения полученного dto непосредственно в моюбаза данных, которая привела к той же ошибке, которую я получаю сейчас.Затем я начал пытаться использовать this.repo.save()
, а затем подумал, что мне может понадобиться просто взять существующую запись и перезаписать ее.К сожалению, мне кажется, что ничего из этого не сработало.
Edit 2:
Столбец, в котором уникальное ограничение не выполняется, НЕ является столбцом первичного ключа.Определение моего столбца для этого:
@Column(name = "NUMBER", nullable = false, unique = true)
private String number;
Редактировать 3:
Мой getIdentityByNumber
определен в моем хранилище:
@Query(value = "SELECT * from TABLE p where p.NUMBER = :num", nativeQuery=true)
public Optional<MyEntity> getIdentityByNumber(@Param("num") String num);