【问题标题】:How to check if exists when using CrudRepository#getOne()使用 CrudRepository#getOne() 时如何检查是否存在
【发布时间】:2020-05-13 20:31:43
【问题描述】:

我有一个Document 实体。要编辑文档,您必须获得DocumentLock

编辑文档的请求 API 如下所示。 edit=true 允许使用 'FOR UPDATE` 从数据库中获取记录。

GET /api/document/123?edit=true

在后端,我们这样做(当然过于简化),

Document document = documentRepository.getOne(documentId)    //<--- (1)

if(document == null){                                        //<--- (2) This is always false
   //Throw exception
}

DocumentLock dl = DocumentLock.builder()
                  .lockedBy(user)
                  .lockedAt(NOW)
                  .document(document)
                  .build()

documentLockRepository.save(dl);

我们使用getOne(),因为我们不需要从数据库中获取整个文档,我们只是创建与DocumentLock 对象的关系。

问题是,如何保证文件确实存在?因为getOne() 将始终返回代理,我没有看到任何明显的方法来检查数据库中是否存在记录。

版本:

  • spring-data-jpa: 2.2.6.RELEASE
  • 休眠:5.4.12

更新:删除了其他问题。

【问题讨论】:

    标签: spring hibernate spring-boot jpa spring-data-jpa


    【解决方案1】:

    使用findByIdexistsById。是的,他们确实访问了数据库。这才是重点,不是吗?

    getOne 明确用于您已经知道实体存在并且只需要将 id 包装在看起来像实体的东西中的用例。

    【讨论】:

    • 你的意思是没有办法使用getOne()返回的代理对象来检查存在性
    • 正确。好吧,从技术上讲,您可以访问非 id 属性并检查您是否获得LazyLoadingException,但这会非常难看。
    【解决方案2】:

    如果您的存储库返回值或其事务管理令人困惑,您应该检查您的存储库代码和实体类设计,甚至用于查询的会话配置,甚至您的数据存储设计,因为在此代码片段中一切看起来都很好

    【讨论】:

      猜你喜欢
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多