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

Quarkus 3.26.2中自定义@LogicDelete替代@SoftDelete无效求助

问题分析与解决

核心问题

你的自定义@LogicDelete注解不生效,主要有三个原因:

  1. 注解冲突:实体类同时标注了原生@SoftDelete和自定义@LogicDelete,Hibernate优先处理直接标注在实体上的@SoftDelete,忽略了自定义注解上的配置。
  2. 注解类型错误:你使用了CDI的@Stereotype注解,但Hibernate的注解处理器不会识别并继承该注解上的Hibernate专属注解(比如@SoftDelete),导致自定义注解上的配置无法传递到实体类。
  3. 缺失逻辑删除字段:你的UserEntity中没有定义deleted字段,Hibernate没有对应的字段来存储逻辑删除状态。

修复步骤

1. 修改自定义@LogicDelete注解定义

移除@Stereotype,添加@Inherited(确保注解可被实体子类继承),并根据需求配置@SoftDelete的默认参数:

package org.baozi.bs.common.db.anntations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.hibernate.annotations.SoftDelete;
import org.hibernate.annotations.SoftDeleteType;
import jakarta.persistence.Converter;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Inherited // 允许子类继承该注解
@SoftDelete(
    columnName = "deleted",
    strategy = SoftDeleteType.DELETED,
    converter = DeleteFieldConverter.class // 配置默认转换器
)
public @interface LogicDelete {
    // 可选:允许用户自定义转换器,覆盖默认值
    // Class<? extends Converter<?>> converter() default DeleteFieldConverter.class;
}

2. 调整实体类

  • 移除原生@SoftDelete注解,只保留@LogicDelete
  • 添加deleted字段,类型与转换器匹配:
@Entity
@LogicDelete
@Table(name = "user")
public class UserEntity {

    @Id
    @SnowId
    @Column(name = "id")
    private Long id;

    @Column(name = "username")
    private String username;

    // 添加逻辑删除字段,默认值为false(未删除)
    @Column(name = "deleted")
    private Boolean deleted = false;

    // ...getters and setters
}

3. 验证转换器实现

确保DeleteFieldConverter正确实现了AttributeConverter,并且注解配置正确:

import jakarta.persistence.Converter;
import jakarta.persistence.AttributeConverter;

@Converter(autoApply = false)
public class DeleteFieldConverter implements AttributeConverter<Boolean, Integer> {
    @Override
    public Integer convertToDatabaseColumn(Boolean attribute) {
        // 将Boolean转换为数据库存储的Integer:true→1,false→0
        return attribute != null && attribute ? 1 : 0;
    }

    @Override
    public Boolean convertToEntityAttribute(Integer dbData) {
        // 将数据库的Integer转换为Boolean:1→true,0→false
        return dbData != null && dbData == 1;
    }
}

验证

启动Quarkus应用后,执行删除操作,检查数据库中user表的deleted字段是否被更新为1(或对应的值),同时查询操作是否自动过滤deleted=1的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 09:23:11