Spring 如何在使用crudepository#getOne()时检查是否存在
我有一个Spring 如何在使用crudepository#getOne()时检查是否存在,spring,hibernate,spring-boot,jpa,spring-data-jpa,Spring,Hibernate,Spring Boot,Jpa,Spring Data Jpa,我有一个文档实体。要编辑文档,必须获取文档锁 编辑文档的请求API如下所示edit=true允许使用“FOR UPDATE”从数据库中获取记录 GET /api/document/123?edit=true 在后端,我们这样做(当然过于简化) Document Document=documentRepository.getOne(documentId)/使用findById或existsById。是的,他们确实访问数据库。这就是重点,不是吗 getOne明确用于您已经知道实体存在并且只需要将i
文档
实体。要编辑文档,必须获取文档锁
编辑文档的请求API如下所示edit=true
允许使用“FOR UPDATE”从数据库中获取记录
GET /api/document/123?edit=true
在后端,我们这样做(当然过于简化)
Document Document=documentRepository.getOne(documentId)/使用findById
或existsById
。是的,他们确实访问数据库。这就是重点,不是吗
getOne
明确用于您已经知道实体存在并且只需要将id包装在与实体相似的东西中的用例。使用findById
或existsById
。是的,他们确实访问数据库。这就是重点,不是吗
getOne
明确适用于您已经知道实体存在并且只需要将id包装在看起来像实体的东西中的用例。如果您的存储库返回值或其事务管理令人困惑,您应该检查您的存储库代码和实体类设计,甚至检查用于查询的会话配置,甚至检查您的数据存储设计,因为如果您的存储库返回值或其事务管理混乱,则此代码片段中的所有内容看起来都很好,您应该检查您的存储库代码和实体类设计,甚至检查用于查询的会话配置,甚至检查您的数据存储设计,因为此代码片段中的所有内容看起来都很好您的意思是无法使用getOne()
返回的代理对象检查是否存在。从技术上讲,您可以访问一个非id属性并检查是否得到一个LazyLoadingException
,但这会非常糟糕。您的意思是,无法使用getOne()
返回的代理对象检查是否存在。从技术上讲,你可以访问一个非id属性,然后检查你是否得到了一个LazyLoadingException
,但那会非常难看。
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);