JPA правильно обновляет Entity - EntityUpdate приводит к IntegrityConstraintViolationException - PullRequest
0 голосов
/ 30 декабря 2018

Я пытался обновить мою сущность следующим кодом:

Не комментированная версия (может быть более читабельной):

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...