【问题标题】:Updating a hibernate entity with CrudRepository使用 CrudRepository 更新休眠实体
【发布时间】:2019-06-22 17:03:03
【问题描述】:

我目前正在编写我的第一个 Spring Boot Kotlin 应用程序,并试图创建一个具有 JPA 持久性的 rest API。基础进展顺利,但我正在努力更新补丁端点上的模型(@patchMapping)。

我想遵守适当的休息标准,因此我将使用@PatchMapping("/company/{id}") 打补丁端点。

我希望能够以这样的方式调用 CrudRepository。

  @PatchMapping("/company/{id}")
  fun update(@PathVariable id: Long, @RequestBody updateRequest: Company) : Company {
    return repository.update(updateRequest, id)
  }

但似乎弹簧的做法是在 requestBody 中传递您要更新的对象的 id?例如

repository.save(updateRequest)

然后自动合并对象。但这与任何理智的休息约定相冲突......

是否有可用于我想要实现的集成解决方案?我想避免编写自己的逻辑,因为我希望 spring 拥有这个功能。

【问题讨论】:

  • 您是否尝试过使用@Query 创建自定义方法来更新特定字段?很少会更新实体的主键,而且这种情况几乎不可能发生。如果您想更新实体的其他属性而不是主键本身,我可以理解。
  • 我不是在这里修改主键,我想要的是通过提供主键作为 url 参数来访问补丁端点,然后找到相应的模型,更新属性并保存它。
  • 太棒了。在这种情况下,您可以使用findById(id) 获取实体,然后更新属性并使用save() 它调用合并而不是持久化,因为它是现有实体。如果您不喜欢这样做,请使用带有@Query 原生查询选项的自定义方法。

标签: spring spring-boot kotlin


【解决方案1】:

你需要这样的东西吗?

 @RestController
 class Controller(private val service: CompanyService) {
   @PatchMapping("/company/{id}")
   fun update(@PathVariable id: Long, @RequestBody company: Company): Company {
     return service.updateCompany(company, id)
   }
 }

 @Service
 class CompanyService (private val repository: CompanyRepository) {
   @Transactional
   fun updateCompany(company: Company, id: Long): Company {
     val companyToUpdate = repository.findOne(id)
     companyToUpdate.setSomething(company.getSomething)
     raturn companyToUpdate;
   }
 }

 interface CompanyRepository : CrudRepository<Company, Long>

【讨论】:

  • 这将是一个选项,是的,虽然我必须包装 CrudRepository 以添加此功能,但这是一种耻辱。我将如何使这个服务类示例可注入?我已经尝试过这个结构,但我收到了错误No qualifying bean of type CompanyService
  • 我忘记了@Service 之类的注释。您可以找到here 的示例
猜你喜欢
  • 2016-12-20
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2018-10-24
  • 2020-02-16
  • 1970-01-01
  • 2014-01-12
相关资源
最近更新 更多