You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:58:16