JpaRepository是否具有用于更新特定对象的补丁方法

时间:2019-09-07 12:51:40

标签: java spring rest spring-boot kotlin

我想知道JpaRepository是否具有仅更新对象的特定值而不从数据库获取整个对象的方法。这是我的代码,对其进行了更多解释:

控制器

@PatchMapping("/{labelKeyUuid}")
@ApiOperation("Update the current version of an existing label key")
fun updateCurrentVersion(@PathVariable labelKeyUuid: UUID,
                         @RequestBody labelValueUuidRequest: LabelValueUuidRequest) {
    val labelValue = labelValueService.findByUuid(labelValueUuidRequest.uuid)
            ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Label value with uuid '\'${labelValueUuidRequest.uuid}\'' not found")
    return labelKeyService.updateCurrentVersion(labelKeyUuid, labelValue)
}

服务

fun findByUuid(uuid: UUID) : LabelValueEntity? {
    return labelValueRepository.findByIdOrNull(uuid)
}

fun updateCurrentVersion(labelKeyUuid: UUID, labelValue: LabelValueEntity) {
    labelKeyRepository.save(labelValue, labelKeyUuid)
}

存储库

@Repository
interface LabelKeyRepository : JpaRepository<LabelKeyEntity, UUID>

JpaRepository具有save(entity)方法。我知道我可以通过从数据库中获取对象并设置新的labelValue并将其保存到数据库来解决此问题。有更快的方法吗?

1 个答案:

答案 0 :(得分:0)

如果您不需要访问对象的当前状态,则可以使用entityManager.getReference()方法。与entityManager.find()相反,此方法不会调用select语句。

entityManager.getReference()作为JPARepository方法在getOne()上公开。

请注意,这两种方法返回的对象均具有自动脏检查功能,应在同一事务中调用find()getReference()及其后续修改,并且这些更改将自动保留。在存储库中仅使用save()来保留新实体或附加分离的实体。

也请阅读: When to use EntityManager.find() vs EntityManager.getReference() with JPA