【发布时间】:2023-03-18 20:35:01
【问题描述】:
我正在使用 Spring Boot 1.5.2.RELEASE 和 PostgreSQL 9.5 数据库。
文件实体:
@Entity
public class File implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String externalUid;
}
文件存储库如下所示:
public interface FileRepository extends JpaRepository<File, Long> {
@Modifying
@Query("UPDATE File f SET f.externalUid =:externalUid WHERE f.id =:id")
void setExternalLink(@Param("id") Long id, @Param("externalUid") String externalId);
}
当我保存新文件(使用刷新)并对其执行更新后,然后从存储库中获取此文件,然后我就有了过时的实体。但是当我在执行修改查询之前在entityManager 上执行clear() [1] 时,我得到了更新的实体:
String externalUid = UUID.randomUUID().toString();
File file = new File();
File savedFile = fileRepository.saveAndFlush(file);
// [1] entityManager.clear();
fileRepository.setExternalLink(savedFile.getId(), externalUid);
File updatedFile = fileRepository.findOne(savedFile.getId());
System.out.print(updatedFile.getExternalUid()); // null
这个问题与这个问题非常相似:Spring Boot Data JPA - Modifying update query - Refresh persistence context。但就我而言,我执行saveAndFlush() 而不是save()。
在这方面,有人可以解释一下为什么我们需要在执行修改查询之前清除持久性上下文以及为什么存储库会返回过时的实体?
【问题讨论】:
-
因为实体将从一级缓存中检索,而不是对数据库进行实际查询。清除时,您会从一级缓存中删除实体,并且需要查询才能再次检索它。
标签: spring hibernate spring-boot jpa spring-data-jpa