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

news/2024/12/29 15:35:58/文章来源:https://www.cnblogs.com/lori/p/18552803

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

1. 使用基类(抽象类)

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

示例代码:

import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;@MappedSuperclass
public abstract class BaseEntity {protected Integer isDelete;@PrePersistpublic void prePersist() {if (isDelete == null) {isDelete = 0; // 设置默认值为0}}// Getter 和 Setterpublic 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 {@Idprivate 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 {@PersistenceContextprivate 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 接口来统一处理审计字段,包括 isDelete。这种方法适合需要更多审计信息的情况,但实现起来相对复杂。

总结

  • 基类:通过创建一个基类,所有需要 isDelete 字段的实体类都可以继承这个基类,避免重复代码。
  • AOP:使用 AOP 可以在插入时动态处理 isDelete 字段,适合大型项目。
  • JPA 审计功能:适合更复杂的审计需求,但实现较复杂。

选择合适的方法取决于你的项目需求和架构。

使用事件监听@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 {@PrePersistpublic 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;
}

4. 扩展JPA,对建立者和更新者的扩展

  • CreatedByField
  • UpdatedByField
  • CreatedByDefaultValueListener
  • UpdatedByDefaultValueListener

CreatedByField

public interface CreatedByField {String getCreatedBy();void setCreatedBy(String createdBy);}

扩展EntityBase实体,不使用默认的CreatedByLastModifiedBy

@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;@PrePersistpublic 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*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836202.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222412 2024-2025-1 《网络与系统攻防技术》实验六实验报告

20222412 2024-2025-1 《网络与系统攻防技术》实验六实验报告 1.实验内容 主要任务:基于Metasploit框架,实现漏洞利用。 Metasploit框架(MSF)由HD Moore于2003年发布,并在2007年使用Ruby语言重写。它提供了一套完整的渗透测试框架,包括漏洞利用模块、攻击载荷、辅助模块、…

01计算机简介

001简介 计算机硬件逻辑组成

访谈李继刚:从哲学层面与大模型对话

当面访谈李继刚,看他如何理解提示工程,从哲学角度探讨提示词的“道”与“术”。相信不少人和我一样,是从“汉语新解”这段爆火提示词中知道李继刚这位“神人”的。直到看到11月4日公众号“数字生命卡兹克”对继刚做了专访文章《专访"Prompt之神"李继刚 - 我想用20…

k8s: 配置ingress的会话亲和(转载)

Ingress会话亲和,又称会话保持,粘性会话,指同一客户端的请求在一定时间内会被ingress路由到相同的pod处理. 本文控制器使用的是ingress-nginxingress默认的负载均衡策略是轮询, 验证如下 使用浏览器连续访问9次ingress 查看ingress日志, 可看到9次请求被轮询负载到不同pod处理 …

线性代数知识点复习——范数

范数(Norm) 是数学中的一个概念,用于度量向量、矩阵或张量的大小或长度。范数是向量空间上的一种函数,能够将向量映射为非负实数,表示向量的某种“长度”或“大小”。

计算机基础-DNS

DNS是什么 DNS(Domain Name System)是⼀种⽤于将域名(例如www.baidu.com)转换为IP地址(例如 220.181.111.188 )的分布式系统。 在互联⽹上,计算机和其他⽹络设备使⽤IP地址来相互识别和通信。 然⽽, IP地址是⼀串数字,不太⽅便⼈们使⽤和记忆,所以就使⽤了域名来代替…

Mybatis 常见异常

Mybatis 列表查询只返回了部分数据,Sql 语句多出 limit 异常 // list查询接口 List<Info> infoList = xxxMapper.selectList();列表查询接口,只返回了部分数据 原因 通过日志观察,发现日志打印的sql多了limit参数,怀疑时与分页有关; 基于此,搜索资料发现,PageHelp…

寻找 2300 名编程青铜一起写代码,学会就送包!

编程不仅仅是技术的积累,更是一种思维方式的转变。身边越来越多朋友已经意识到,学会一门编程语言,就好像掌握了新的国际通用语言,享受学习交流世界最前沿知识、思想的快乐。编程不仅仅是技术的积累,更是一种思维方式的转变。身边越来越多朋友已经意识到,学会一门编程语言…

【PhpStorm 2024 软件下载与入门级安装教程】-高效智能的 PHP IDE

支持主流框架 PhpStorm完美支持Symfony、Drupal、WordPress、Zend Framework、Laravel、Magento、 Joomla!、CakePHP、Yii ...等各种主流框架。 全能的PHP工具 内建编辑器实际“了解”您的代码并且深刻理解其结构,支持所有PHP语言功能, 在开发现代技术和维护遗留项目皆可完美…

Exchange 2016部署实施案例篇-07.Exchange日常运维检查

有了Exchange Server 相信大家最苦恼的一件事情就是每天要如何检查Exchange Server是否运行正常,今天就给大家分享下日常检查的一些操作步骤。 日常检查 邮件发送功能检查如何确保Exchange服务器可以正常往外网发送邮件,其实这个是很简单的,只需要一个简单的脚本就可以实现,…

巡检人员超长时间停留识别智慧矿山一体机人车防碰撞识别:打造智慧矿山的创新方案

智慧矿山一体机是专为矿山环境量身定制的智能化解决方案,旨在通过集成先进的感知、计算、通信、控制等信息技术和自动控制技术,实现对矿山生产、管理、安全、环保等各个环节的智能化改造和升级。这一方案不仅提高了矿山的生产效率,降低了运营成本,还显著增强了安全监管能力…

Exchange 2016部署实施案例篇-06.升级到最新CU补丁

更新到最新CU补丁这篇其实我是想更新完公网发布在写的,但由于最近条件有限,原来用于测试的公网IP地址由于运营商原因一直没办法更新,所以只好先更新这篇了。 扩展架构首先我们还需要进行域架构扩展(或者让安装程序自己扩展也行),如图所示:扩展 Active Directory 架构: …