Я использую Spring-Data JPA и Spring-MVC с интерфейсом RESTful. Я пытаюсь реализовать базовый контроллер CRUD. Мне сложно понять, как реализовать «Обновление».Есть ли простой способ обновить объект Spring-Data с помощью Spring MVC & JSON
Мой основной метод управления является прямым:
@RequestMapping(method=RequestMethod.POST, value="updateUser", produces=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public User update(@RequestBody final User user){
userRepository.save(user);
return user;
}
Однако, это только кажется, чтобы обеспечить «создать» - не «обновление». Каждый раз, когда вызывается метод, в БД создается новый пользователь, даже если я укажу User PK в объекте JSON.
С быстрым взглядом на класс SimpleJpaRepository
он создает новый объект, когда отсутствует поле «версия». Тем не менее, если я заставляю поле «версии», чтобы иметь значение, я получаю исключение (не удивительно):
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.ia.domain.User#5]
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:303)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:151)
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:914)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:898)
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:902)
at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:889)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
Я понимаю, что один из вариантов являются первым запросом к БД для существующего объекта пользователя (основанный на представленную PK), затем скопируйте все поля поверх и затем сохраните этот объект, но это не похоже на правильный путь. Я предполагаю, что для меня должен быть способ «объединить» мой объект User
и просто обновить его, но я не совсем уверен, как это сделать.
Есть ли простой способ сделать это?
Рассмотрите, что найди сначала, а затем обновите – Koitoer
@Koitoer - Я могу определенно сначала выполнить поиск, а затем обновить, но тогда мне нужно скопировать все поля из объекта POSTED JSON, и я не уверен, есть ли у вас быстрый/легкий/эффективный способ сделать это. –