之前写过关于springboot~jpa优雅的处理isDelete的默认值的文章,今天说一下在jpa或者其它类型的Repository中实现软删除的方法,主要借助了自定义的仓储的能力。
优雅的引用方式
- /**
- * 开启软删除的能力
- *
- * @author lind
- * @date 2025/9/8 11:24
- * @since 1.0.0
- */
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @EnableJpaRepositories(repositoryBaseClass = SoftDeleteRepositoryImpl.class)
- public @interface EnableSoftDeleteRepository {
- }
复制代码 接口标准化
- /**
- * 软删除能力,通过@EnableSoftDeleteRepository注解开启功能,通过接口继承的方式实现这个能力
- *
- * @param <T>
- * @param <ID>
- */
- @NoRepositoryBean // 不让jpa使用代理建立实现类
- public interface SoftDeleteRepository<T, ID> {
- T getEntityById(ID id);
- /**
- * 希望重写findById方法
- * @param id
- * @return
- */
- T getById(ID id);
- }
复制代码 覆盖默认的deleteById方法,实现软删除
- /**
- * 自定义的公共仓储的实现
- *
- * @param <T>
- * @param <ID>
- */
- public class SoftDeleteRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> implements SoftDeleteRepository<T, ID> {
- private final EntityManager entityManager;
- private final JpaEntityInformation<T, ID> jpaEntityInformation;
- Class<T> domainType;
- Logger logger = LoggerFactory.getLogger(SoftDeleteRepositoryImpl.class);
- public SoftDeleteRepositoryImpl(JpaEntityInformation<T, ID> jpaEntityInformation, EntityManager entityManager) {
- super(jpaEntityInformation, entityManager); // 必须调用父类构造函数
- this.entityManager = entityManager;
- this.jpaEntityInformation = jpaEntityInformation;
- this.domainType = jpaEntityInformation.getJavaType();
- }
- @Override
- public T getEntityById(ID id) {
- return entityManager.find(this.domainType, id);
- }
- /**
- * @param id
- * @deprecated
- */
- @Override
- public void deleteById(ID id) {
- logger.info("CustomRepositoryImpl.getById " + id);
- T entity = getEntityById(id);
- if (entity != null && entity instanceof DeletedFlagField) {
- ((DeletedFlagField) entity).setDeletedFlag(1);
- entityManager.merge(entity);
- }
- else {
- super.deleteById(id);
- }
- }
- }
复制代码 需要实现软删除的仓库接口上,继承这个接口即有这个软删除的能力- /**
- * 用户仓储
- *
- * @author lind
- * @date 2025/7/15 15:56
- * @since 1.0.0
- */
- public interface UserEntityRepository extends SoftDeleteRepository<UserEntity, String>,
- JpaRepository<UserEntity, String>, JpaSpecificationExecutor<UserEntity> {
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |