Spring Data JPA自定义更新查询无法更新数据库实体问题排查
问题:Spring Data JPA无法更新document_id字段,无报错但未生效
使用Spring Data JPA操作数据库时,遇到异常情况:无论是通过自定义JPQL更新查询,还是直接修改实体后调用save()方法,都无法修改数据库表job_meta中的document_id字段。整个执行过程没有抛出任何异常,但数据库中的数据始终未发生变化。
相关代码详情
1. 仓库层自定义更新查询
@Modifying(clearAutomatically = true) @Transactional @Query("UPDATE JobMeta j SET j.document_id = :document_id, j.status = :status WHERE j.id = :id") int updateDocumentIdAndStatus(@Param("id") Long id, @Param("document_id") String documentId, @Param("status") String status);
2. 服务层调用逻辑
public void updateJobStatus(final DmsCallbackRequest request) { final Long jobId = Long.valueOf(request.getJobId()); logger.info("spider : Updating the Job Status after DMS Callback: {} {}", request.getJobId(), request.getZipDocumentId()); final Optional<JobMeta> optionalJobMeta = this.jobMetaRepository.findById(jobId); try { if (optionalJobMeta.isPresent()) { logger.info("spider : ZipDocumentId received from request: {} {}", request.getJobId(), request.getZipDocumentId()); int count = this.jobMetaRepository.updateDocumentIdAndStatus(jobId, request.getZipDocumentId(), States.zip_success.name()); logger.info("spider : JobMeta Rows Updated: {}", count); } else { logger.warn("spider : JobMeta not found for JobId: {}", request.getJobId()); throw new JobMetaNotFoundException("JobMeta not found for JobId: " + request.getJobId()); } } catch (Exception e) { logger.error("Error updating job status to 'success' for JobMeta Id: {} {}", jobId, e.getMessage()); throw new RuntimeException("Error updating job status to 'success'", e); } }
3. 已尝试的两种更新方案
- 方案一:直接更新实体并调用save()
if (optionalJobMeta.isPresent()) { logger.info("spider : ZipDocumentId received from request: {} {}", request.getJobId(), request.getZipDocumentId()); JobMeta meta = optionalJobMeta.get(); meta.setDocument_id(request.getZipDocumentId()); meta.setStatus(States.zip_success.name()); jobMetaRepository.save(meta); logger.info("spider : JobMeta Rows Updated"); }
- 方案二:调用自定义更新查询
int count = this.jobMetaRepository.updateDocumentIdAndStatus(jobId, request.getZipDocumentId(), States.zip_success.name());
4. JobMeta实体类定义
package com.sh.spider.entity; import jakarta.persistence.*; import lombok.*; import java.io.Serializable; import java.time.LocalDateTime; import java.util.HashSet; import java.util.Set; @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder @Entity @Table(name = "job_meta") public class JobMeta implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) @JoinColumn(name = "id") private Set<JobDetail> jobDetails = new HashSet<>(); private int total_links; private int success_links; private int failed_links; private String document_id; private String user_identifier; private String status; private LocalDateTime created_on; private String zip_url; private LocalDateTime zip_expired_on; }
疑问
- 为何自定义更新查询无法正常生效?
- 是否需要额外的配置或调整才能解决该问题?
内容的提问来源于stack exchange,提问作者Samarth Asthana
相关产品推荐
相关产品推荐

