首页 > 其他分享 >jpa~为字段添加insert的默认值

jpa~为字段添加insert的默认值

时间:2024-09-27 15:15:11浏览次数:6  
标签:insert jpa class javax import isDelete 默认值 public persistence

前言

如果多个实体类都有 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 接口来统一处理审计字段,包括 建立时间,更新时间,建立人,删除人等,这个功能比较局限

示例代码:

@EntityListeners(AuditingEntityListener.class)
public abstract class EntityBase implements Serializable {

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

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

	/**
	 * 创建时间
	 */
	@Column(name = "created_time")
	@CreatedDate
	private java.time.LocalDateTime createdTime;

	/**
	 * 更新时间
	 */
	@Column(name = "update_time")
	@LastModifiedDate
	private java.time.LocalDateTime updateTime;

}

// 基于dubbo下的netty中获取当前请求头中的用户名
@EnableJpaAuditing
@Component
public class AuditorAwareImpl implements AuditorAware<String> {

	@Override
	public Optional<String> getCurrentAuditor() {
		Object request = RpcContext.getServiceContext().getRequest();
		if (request != null) {
			NettyRequestFacade requestFacade = (NettyRequestFacade) request;

			if (requestFacade != null && requestFacade.getHeader("username") != null) {
				return Optional.of(requestFacade.getHeader("username"));
			}
		}
		return Optional.of("none");
	}

}

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;
}

标签:insert,jpa,class,javax,import,isDelete,默认值,public,persistence
From: https://www.cnblogs.com/lori/p/18435761

相关文章

  • 奇妙的 JDBC batch insert 到 Doris 异常的问题
    遇到一个很奇怪的异常,通过JDBCbatchinsert时,会报`Unknowncommand(27)`的异常。![exception.png](https://upload-images.jianshu.io/upload_images/13187386-c3138cbb820d3f21.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)而且这个问题很容易复现,复现例子:1.......
  • SpringBoot集成JPA及基本使用
    参考地址: https://blog.csdn.net/JingAi_jia917/article/details/138159418前言在讲解SpringBoot集成JPA之前,先简单了解一下几个概念,JDBC、ORM、JPA以及SpringDataJPA。1.1JDBCJDBC(JavaDataBaseConnectivity),是java连接数据库操作的原生接口API,为开发者访问数据库提供标准......
  • 第二百四十一节 JPA教程 - JPA一对一主键连接列示例、JPA一对一映射级联示例
    JPA教程-JPA一对一主键连接列示例例子下面的代码来自Person.java。packagecn.w3cschool.common;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.pe......
  • SpringBoot整合JPA,配置多数据库
    SpringBoot创建项目非常方便,而且进行数据访问抛弃了很多繁琐的配置,我前面写的系列博文中,有教大家如何使用SpringBoot进行数据访问,里面谈到了整合JDBC、MyBatis以及JPA。我自己实际开发中,如果没有什么要求限制的话,比较习惯使用JPA进行数据访问,所以在这里,我专门编写一篇博文,来教如何......
  • DFT理论知识 scan insertion详解
    ###DFT理论知识:SCANInsertion详解####一、SCANInsertion概述**1.定义**SCANInsertion是设计可测试性(DesignForTestability,DFT)中的一种技术,通过在芯片设计中插入扫描链(ScanChain),使得原本难以测试的组合逻辑电路变得可测试。扫描链通过将触发器(Flip-Flop)转换为......
  • Spring webflux注解:提供全面的JPA注解应用案例(必须收藏)
    SpringWebFlux,Spring生态中的响应式Web框架,通过其独特的非阻塞I/O模型,引领了JavaWeb开发新潮流。它利用@EnableWebFlux注解激活响应式编程模式,结合@RestController和@RequestMapping注解,为开发人员提供了构建异步、事件驱动Web应用的能力。SpringWebFlux背后的ProjectReactor......
  • 数据库的操作:DML数据操纵语言:增删修改查(insert/delete/update/select)
    一.概论对表中的数据进行操纵的语言二.语法:1.增加数据:insert2.删除数据:delete3.修改数据:update4.查找数据:select三.案例insert/delete/update/select1.查找商品数量:select语法:select字段|表达式from表名|视图|结果集[where条件][groupby分组][having分组之......
  • jpa适配mysql切换达梦可能的坑
    1、liquibase脚本(1)达梦数据库不支持,修改字段varchar改成blob<changeSetauthor="ly"id="v3.0_4_202307111505_101"><renameColumntableName="PC_SS_ZRQD"oldColumnName="BHNR"newColumnName="BHNR"columnDataType=&q......
  • 【编程基础知识】mysql中的insert into ... on DUPLICATE key和replace into的性能对
    一、概述在MySQL中,INSERTINTO...ONDUPLICATEKEYUPDATE和REPLACEINTO都是用来处理插入或更新数据的语句,但它们在性能和行为上有所不同。二、REPLACEINTOREPLACEINTO语句在遇到唯一键或主键冲突时,会先删除旧记录,然后插入新记录。这意味着它会执行两次操作:删除......
  • BUG: pymysql executemany不支持insert on duplicate key update
    pymysql的executemany()方法支持传入单个SQL和一个sequenceofrecords(sequenceormapping)来同时写入多条数据。例如:sql="insertintot(c1,c2)values(%s,%s)"args=[(1,2),(3,4)]cursor.executemany(sql,args)#Ifargsisalistortuple,%scanbeusedas......