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

基于Spring Boot、Spring Data JPA和MySQL实现Java REST API软删除

实现供应商软删除(标记归档状态)的代码修改方案

1. 修改实体类 CloudVendor.java

添加归档状态字段,默认值为false(表示未归档),同时补充对应的构造方法、getter/setter:

package com.thinkcon.demo.model;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Column;

@Entity
@Table(name="cloud_vendor_info")
public class CloudVendor {
    @Id
    private String vendorId;
    private String vendorName;
    private String vendorAddress;
    private String vendorPhoneNumber;
    // 归档状态字段,默认未归档
    @Column(columnDefinition = "BOOLEAN DEFAULT FALSE")
    private boolean archived;

    // 带参构造方法补充archived参数
    public CloudVendor(String vendorId, String vendorName, String vendorAddress, String vendorPhoneNumber, boolean archived) {
        this.vendorId = vendorId;
        this.vendorName = vendorName;
        this.vendorAddress = vendorAddress;
        this.vendorPhoneNumber = vendorPhoneNumber;
        this.archived = archived;
    }

    // 无参构造方法保持不变
    public CloudVendor() {}

    // 补充archived的getter和setter
    public boolean isArchived() {
        return archived;
    }

    public void setArchived(boolean archived) {
        this.archived = archived;
    }

    // 原有字段的getter/setter保持不变
    public String getVendorId() { return vendorId; }
    public String getVendorName() { return vendorName; }
    public String getVendorAddress() { return vendorAddress; }
    public String getVendorPhoneNumber() { return vendorPhoneNumber; }
    public void setVendorId(String vendorId) { this.vendorId = vendorId; }
    public void setVendorName(String vendorName) { this.vendorName = vendorName; }
    public void setVendorAddress(String vendorAddress) { this.vendorAddress = vendorAddress; }
    public void setVendorPhoneNumber(String vendorPhoneNumber) { this.vendorPhoneNumber = vendorPhoneNumber; }
}

2. 扩展Repository接口

假设你的CloudVendorRepository继承了JpaRepository,添加更新归档状态和查询未归档数据的方法:

package com.thinkcon.demo.repository;

import com.thinkcon.demo.model.CloudVendor;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface CloudVendorRepository extends JpaRepository<CloudVendor, String> {
    // 标记供应商为归档状态
    @Modifying
    @Transactional
    @Query("UPDATE CloudVendor cv SET cv.archived = true WHERE cv.vendorId = ?1")
    void markAsArchived(String vendorId);

    // 查询所有未归档的供应商
    List<CloudVendor> findByArchivedFalse();
}

3. 修改Service实现类 CloudVendorServiceImpl.java

替换硬删除逻辑为标记归档,同时调整查询方法过滤已归档数据:

package com.thinkcon.demo.service.impl;

import java.util.List;

import org.springframework.stereotype.Service;
import com.thinkcon.demo.model.CloudVendor;
import com.thinkcon.demo.repository.CloudVendorRepository;
import com.thinkcon.demo.service.CloudVendorService;

@Service
public class CloudVendorServiceimpl implements CloudVendorService {

    CloudVendorRepository cloudVendorRepository;

    public CloudVendorServiceimpl(CloudVendorRepository cloudVendorRepository){
        this.cloudVendorRepository = cloudVendorRepository;
    }

    @Override
    public String createCloudVendor(CloudVendor cloudVendor) {
        // 创建时默认设置为未归档
        cloudVendor.setArchived(false);
        cloudVendorRepository.save(cloudVendor);
        return "Success";
    }

    @Override
    public String updateCloudVendor(CloudVendor cloudVendor) {
        cloudVendorRepository.save(cloudVendor);
        return "Success";
    }

    @Override
    public String deleteCloudVendor(String cloudVendorId) {
        // 替换硬删除为标记归档
        cloudVendorRepository.markAsArchived(cloudVendorId);
        return "Success";
    }

    @Override
    public CloudVendor getCloudVendor(String cloudVendorId) {
        // 过滤已归档的供应商,未找到或已归档返回null(可按需调整)
        return cloudVendorRepository.findById(cloudVendorId)
                .filter(vendor -> !vendor.isArchived())
                .orElse(null);
    }

    @Override
    public List<CloudVendor> getAllCloudVendors() {
        // 返回所有未归档的供应商
        return cloudVendorRepository.findByArchivedFalse();
    }
}

4. 调整控制器提示(可选)

修改删除接口的返回提示,更贴合软删除逻辑:

@DeleteMapping("{vendorId}")
public String deleteCloudVendorDetails(@PathVariable("vendorId")String vendorId)
{
    cloudVendorService.deleteCloudVendor(vendorId);
     return "CloudVendor marked as archived Successfully";
}

补充说明

  • 若开启JPA自动建表,数据库会自动新增archived字段;手动建表需添加archived BOOLEAN DEFAULT FALSE字段。
  • 如需查询已归档供应商,可在Repository中添加findByArchivedTrue()方法,按需暴露接口。
  • 原有更新接口支持手动修改归档状态,可通过请求体传入archived字段调整。

内容的提问来源于stack exchange,提问作者Dadinho2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:50:24