基于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
相关产品推荐
相关产品推荐

