springboot~jpa优雅的处理isDelete的默认值

打印 上一主题 下一主题

主题 867|帖子 867|积分 2601

如果多个实体类都有 isDelete 字段,并且你希望在插入时为它们统一设置默认值,可以采取以下几种方法来减少代码重复:
1. 利用基类(抽象类)

创建一个基类,其中包含 isDelete 字段和 @PrePersist 方法。然后让所有需要这个字段的实体类继承这个基类。
示例代码:
  1. import javax.persistence.MappedSuperclass;
  2. import javax.persistence.PrePersist;
  3. @MappedSuperclass
  4. public abstract class BaseEntity {
  5.     protected Integer isDelete;
  6.     @PrePersist
  7.     public void prePersist() {
  8.         if (isDelete == null) {
  9.             isDelete = 0; // 设置默认值为0
  10.         }
  11.     }
  12.     // Getter 和 Setter
  13.     public Integer getIsDelete() {
  14.         return isDelete;
  15.     }
  16.     public void setIsDelete(Integer isDelete) {
  17.         this.isDelete = isDelete;
  18.     }
  19. }
复制代码
然后在其他实体类中继承 BaseEntity:
  1. import javax.persistence.Entity;
  2. import javax.persistence.Id;
  3. @Entity
  4. public class MyEntity extends BaseEntity {
  5.     @Id
  6.     private Long id;
  7.     // 其他字段、getter 和 setter
  8. }
复制代码
2. 利用 AOP(面向切面编程)

通过 Spring AOP 创建一个切面,在插入操作时查抄并设置 isDelete 的默认值。这种方式不需要修改每个实体类,适合大规模应用。
示例代码:
  1. import org.aspectj.lang.annotation.Aspect;
  2. import org.aspectj.lang.annotation.Before;
  3. import org.springframework.stereotype.Component;
  4. import javax.persistence.EntityManager;
  5. import javax.persistence.PersistenceContext;
  6. import java.lang.reflect.Field;
  7. @Aspect
  8. @Component
  9. public class DefaultValueAspect {
  10.     @PersistenceContext
  11.     private EntityManager entityManager;
  12.     @Before("execution(* com.example.repository.*.save(..))") // 根据你的仓库路径调整
  13.     public void setDefaultValues(Object entity) throws IllegalAccessException {
  14.         Field[] fields = entity.getClass().getDeclaredFields();
  15.         for (Field field : fields) {
  16.             if ("isDelete".equals(field.getName())) { // 检查字段名
  17.                 field.setAccessible(true);
  18.                 if (field.get(entity) == null) {
  19.                     field.set(entity, 0); // 设置默认值为0
  20.                 }
  21.             }
  22.         }
  23.     }
  24. }
复制代码
3. 利用 JPA 审计功能

利用 Spring Data JPA 的审计功能,通过实现 AuditorAware 接口来统一处理审计字段,包括 createdBy,createdTime,updatedBy,updatedTime等,而isDelete这种状态字段在审计注释中并没有实现。
4. 利用事件监听@EntityListeners

JPA 提供了事件监听器的功能,你可以定义一个事件监听器来处理所有需要设置默认值的实体类。
示例代码:
  1. import javax.persistence.PostLoad;
  2. import javax.persistence.PrePersist;
  3. import javax.persistence.EntityListeners;
  4. public interface DeletedField {
  5.           Integer getDeletedFlag();
  6.         void setDeletedFlag(Integer deletedFlag);
  7. }
  8. public class DeleteDefaultValueListener {
  9.         @PrePersist
  10.         public void setDefaultValues(DeletedFlagField deletedFlagField) {
  11.                 if (deletedFlagField.getDeletedFlag() == null) {
  12.                         deletedFlagField.setDeletedFlag(0); // 设置默认值为0
  13.                 }
  14.         }
  15. }
  16. @EntityListeners(DefaultValueListener.class)
  17. @Entity
  18. public class TableUserAccount extends EntityBase implements DeletedFlagField {
  19.           /**
  20.          * 删除标识(逻辑删除),1删除 0未删除
  21.          */
  22.         @Column(name = "deleted_flag")
  23.         private Integer deletedFlag;
  24. }
复制代码
5. 扩展JPA,对审计字段建立者和更新者的扩展


  • CreatedByField 建立者字段接口
  • UpdatedByField 更新者字段接口
  • CreatedByDefaultValueListener 建立者字段监听器
  • UpdatedByDefaultValueListener 更新者字段监听器
  • AuditorAwareImpl 审计接口,返回当前用户
CreatedByField
  1. public interface CreatedByField {
  2.         String getCreatedBy();
  3.         void setCreatedBy(String createdBy);
  4. }
复制代码
扩展EntityBase实体,不利用默认的CreatedBy和LastModifiedBy
  1. @Getter
  2. @Setter
  3. @MappedSuperclass
  4. @EntityListeners({ AuditingEntityListener.class, UpdatedByDefaultValueListener.class,
  5.                 CreatedByDefaultValueListener.class })
  6. public abstract class EntityBase implements Serializable, CreatedByField, UpdatedByField {
  7.         /**
  8.          * 创建人
  9.          */
  10.         @Column(name = "created_by")
  11.         private String createdBy;
  12.         /**
  13.          * 修改人
  14.          */
  15.         @Column(name = "updated_by")
  16.         private String updatedBy;
  17.         }
复制代码
CreatedByDefaultValueListener
  1. public class CreatedByDefaultValueListener implements ApplicationContextAware {
  2.         private ApplicationContext applicationContext;
  3.         @PrePersist
  4.         public void setDefaultValues(CreatedByField createdByField) {
  5.                 if (createdByField.getCreatedBy() == null) {
  6.                         if (this.applicationContext.getBean(AuditorAwareImpl.class) != null) {
  7.                                 createdByField.setCreatedBy(
  8.                                                 this.applicationContext.getBean(AuditorAwareImpl.class).getCurrentAuditor().orElse(""));
  9.                         }
  10.                 }
  11.         }
  12.         /**
  13.          * @param applicationContext
  14.          * @throws BeansException
  15.          */
  16.         @Override
  17.         public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  18.                 this.applicationContext = applicationContext;
  19.         }
  20. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

光之使者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表