gpt4 book ai didi

java - 有没有一种简单的方法可以使用 Spring MVC 和 JSON 更新基于 Spring-Data 的对象

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:38 26 4
gpt4 key购买 nike

我正在使用带有 RESTful 接口(interface)的 Spring-Data JPA 和 Spring-MVC。我正在尝试实现一个基本的 CRUD Controller 。我在找出实现“更新”的最佳方法时遇到了一些困难。

我的基本 Controller 方法很简单:

@RequestMapping( method=RequestMethod.POST, value="updateUser", produces=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public User update( @RequestBody final User user){
userRepository.save(user);
return user;
}

但是,这似乎只提供“创建”,而不是“更新”。每次调用该方法时,即使我在 JSON 对象中指定了用户 PK,也会在数据库中创建一个新用户。

快速浏览一下 SimpleJpaRepository 类,只要缺少“version”字段,它就会创建一个新对象。但是,如果我强制“版本”字段具有值,则会出现异常(毫不奇怪):

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)

我意识到一个选择是首先在数据库中查询现有的 User 对象(基于提交的 PK),然后复制所有字段,然后保存该对象,但这似乎不是正确的方法。我认为必须有一种方法可以“合并”我的 User 对象并更新它,但我不完全确定如何操作。

有没有简单的方法可以做到这一点?

最佳答案

跟踪hibernate代码的错误,发现存在与版本相关的问题

else if ( isVersionChanged( entity, source, persister, target ) ) {
299 if ( source.getFactory().getStatistics().isStatisticsEnabled() ) {
300 source.getFactory().getStatisticsImplementor()
301 .optimisticFailure( entityName );
302 }
303 throw new StaleObjectStateException( entityName, id );
304 }

/VersionChanges 是

342     boolean changed = ! persister.getVersionType().isSame(
343 persister.getVersion( target ),
344 persister.getVersion( entity )
345 );

错误来自实体的不同版本,考虑使用JPARepository的标准方法来保存。

@Transactional
public <S extends T> S save(S entity)

还用 userRepository 的代码更新您的问题,因为我认为 saveUser 是您自己的实现

关于java - 有没有一种简单的方法可以使用 Spring MVC 和 JSON 更新基于 Spring-Data 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com