Quarkus 3.26.2中自定义@LogicDelete替代@SoftDelete无效求助
问题分析与解决
核心问题
你的自定义@LogicDelete注解不生效,主要有三个原因:
- 注解冲突:实体类同时标注了原生
@SoftDelete和自定义@LogicDelete,Hibernate优先处理直接标注在实体上的@SoftDelete,忽略了自定义注解上的配置。 - 注解类型错误:你使用了CDI的
@Stereotype注解,但Hibernate的注解处理器不会识别并继承该注解上的Hibernate专属注解(比如@SoftDelete),导致自定义注解上的配置无法传递到实体类。 - 缺失逻辑删除字段:你的
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
相关产品推荐
相关产品推荐

