springboot jpa实现优雅处理isDelete的默认值

 更新时间:2024年11月19日 08:21:52   作者:张占岭  
如果多个实体类都有 isDelete 字段,并且你希望在插入时为它们统一设置默认值时改怎么做呢,本文为大家整理了一些方法,希望对大家有所帮助

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

1. 使用基类(抽象类)

创建一个基类,其中包含 isDelete 字段和 @PrePersist 方法。然后让所有需要这个字段的实体类继承这个基类。

示例代码:

import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;

@MappedSuperclass
public abstract class BaseEntity {

    protected Integer isDelete;

    @PrePersist
    public void prePersist() {
        if (isDelete == null) {
            isDelete = 0; // 设置默认值为0
        }
    }

    // Getter 和 Setter
    public Integer getIsDelete() {
        return isDelete;
    }

    public void setIsDelete(Integer isDelete) {
        this.isDelete = isDelete;
    }
}

然后在其他实体类中继承 BaseEntity

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class MyEntity extends BaseEntity {

    @Id
    private Long id;

    // 其他字段、getter 和 setter
}

2. 使用 AOP(面向切面编程)

通过 Spring AOP 创建一个切面,在插入操作时检查并设置 isDelete 的默认值。这种方式不需要修改每个实体类,适合大规模应用。

示例代码:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.lang.reflect.Field;

@Aspect
@Component
public class DefaultValueAspect {

    @PersistenceContext
    private EntityManager entityManager;

    @Before("execution(* com.example.repository.*.save(..))") // 根据你的仓库路径调整
    public void setDefaultValues(Object entity) throws IllegalAccessException {
        Field[] fields = entity.getClass().getDeclaredFields();
        for (Field field : fields) {
            if ("isDelete".equals(field.getName())) { // 检查字段名
                field.setAccessible(true);
                if (field.get(entity) == null) {
                    field.set(entity, 0); // 设置默认值为0
                }
            }
        }
    }
}

3. 使用 JPA 审计功能

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

4. 使用事件监听@EntityListeners

JPA 提供了事件监听器的功能,你可以定义一个事件监听器来处理所有需要设置默认值的实体类。

示例代码:

import javax.persistence.PostLoad;
import javax.persistence.PrePersist;
import javax.persistence.EntityListeners;

public interface DeletedField {

  	Integer getDeletedFlag();

	void setDeletedFlag(Integer deletedFlag);
}

public class DeleteDefaultValueListener {

	@PrePersist
	public void setDefaultValues(DeletedFlagField deletedFlagField) {
		if (deletedFlagField.getDeletedFlag() == null) {
			deletedFlagField.setDeletedFlag(0); // 设置默认值为0
		}
	}

}

@EntityListeners(DefaultValueListener.class)
@Entity
public class TableUserAccount extends EntityBase implements DeletedFlagField {

  	/**
	 * 删除标识(逻辑删除),1删除 0未删除
	 */
	@Column(name = "deleted_flag")
	private Integer deletedFlag;
}

5. 扩展JPA,对审计字段建立者和更新者的扩展

  • CreatedByField 建立者字段接口
  • UpdatedByField 更新者字段接口
  • CreatedByDefaultValueListener 建立者字段监听器
  • UpdatedByDefaultValueListener 更新者字段监听器
  • AuditorAwareImpl 审计接口,返回当前用户

CreatedByField

public interface CreatedByField {

	String getCreatedBy();

	void setCreatedBy(String createdBy);

}

扩展EntityBase实体,不使用默认的CreatedBy和LastModifiedBy

@Getter
@Setter
@MappedSuperclass
@EntityListeners({ AuditingEntityListener.class, UpdatedByDefaultValueListener.class,
		CreatedByDefaultValueListener.class })
public abstract class EntityBase implements Serializable, CreatedByField, UpdatedByField {

	/**
	 * 创建人
	 */
	@Column(name = "created_by")
	private String createdBy;

	/**
	 * 修改人
	 */
	@Column(name = "updated_by")
	private String updatedBy;
	}

CreatedByDefaultValueListener

public class CreatedByDefaultValueListener implements ApplicationContextAware {

	private ApplicationContext applicationContext;

	@PrePersist
	public void setDefaultValues(CreatedByField createdByField) {
		if (createdByField.getCreatedBy() == null) {
			if (this.applicationContext.getBean(AuditorAwareImpl.class) != null) {
				createdByField.setCreatedBy(
						this.applicationContext.getBean(AuditorAwareImpl.class).getCurrentAuditor().orElse(""));

			}
		}
	}

	/**
	 * @param applicationContext
	 * @throws BeansException
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext = applicationContext;
	}

}

到此这篇关于springboot jpa实现优雅处理isDelete的默认值的文章就介绍到这了,更多相关springboot jpa处理isDelete默认值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 工具类总结目录(分享)

    Java 工具类总结目录(分享)

    下面小编就为大家带来一篇Java 工具类总结目录(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 基于Java设计一个短链接生成系统

    基于Java设计一个短链接生成系统

    相信大家在生活中会收到很多短信,而这些短信都有一个特点是链接很短。这些链接背后的原理是什么呢?怎么实现的?小编今天就带你们详细了解一下
    2021-12-12
  • JAVA 数据结构之Queue处理实例代码

    JAVA 数据结构之Queue处理实例代码

    这篇文章主要介绍了JAVA 数据结构之Queue处理实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • java监听器实现在线人数统计

    java监听器实现在线人数统计

    这篇文章主要为大家详细介绍了java监听器实现在线人数统计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Java中实现日志记录的方案总结

    Java中实现日志记录的方案总结

    在平时使用到一些软件中,比如某宝或者某书,通过记录用户的行为来构建和分析用户的行为数据,这就需要使用到日志系统来存储或者记录数据,小编为大家整理了几种Java日志方案,希望对大家有所帮助
    2024-12-12
  • Java中避免空指针检查的方法小结

    Java中避免空指针检查的方法小结

    在Java编程中,NullPointerException 是一个常见的运行时异常,为了避免该异常,开发者常常需要编写大量的 x != null 检查代码,然而,过多的空指针检查会使代码变得冗长和难以维护,所以本文给大家介绍了Java中避免空指针检查的方法,需要的朋友可以参考下
    2025-06-06
  • Java 栈和队列的相互转换详解

    Java 栈和队列的相互转换详解

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2022-02-02
  • 浅析Java项目中如何同时连接多个Redis实例

    浅析Java项目中如何同时连接多个Redis实例

    在现代分布式系统中,Redis作为高性能的内存数据库,广泛应用于缓存,会话存储,消息队列等场景,本文我们就来看看如何在Java项目中同时连接多个Redis实例吧
    2025-06-06
  • Java几个实例带你进阶升华上篇

    Java几个实例带你进阶升华上篇

    与其明天开始,不如现在行动,本文为你带来几个Java书写的实际案例,对巩固编程的基础能力很有帮助,快来一起往下看看吧
    2022-03-03
  • Java变量的初始化及静态方法的实现

    Java变量的初始化及静态方法的实现

    这篇文章主要介绍了Java变量的初始化及静态方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10

最新评论