jpa Auditor 自动赋值与自定义 @CreatedBy @LastModifiedBy @CreatedDate @LastModifiedDate
在spring jpa audit 中,在字段或者方法上使用注解@CreatedDate
、@CreatedBy
、@LastModifiedDate
、@LastModifiedBy
,当进行实体插入或者更新可以自动赋值
@CreatedDate 创建时间
@CreatedBy 创建人
@LastModifiedDate 更新时间
@LastModifiedBy 更新人
使用:
1.定义实体类,并使用注解标注字段
import lombok.Data;
import org.springframework.data.annotation.*;
import org.springframework.data.mongodb.core.mapping.Field; import java.time.LocalDateTime; @Data
public class BaseEntity {
@Id private String id;
@Field @CreatedBy private String createUserId; @Field @LastModifiedBy private String updateUserId; @Field @CreatedDate private LocalDateTime createTime; // 创建时间 @Field @LastModifiedDate private LocalDateTime updateTime; // 修改时间
}
2.添加 AuditorAware配置,设置默认用户
@Configuration
@EnableMongoAuditing(auditorAwareRef = "jpaAuditorAware")//使用mongo,也可以使用其他,如jpa(mysql)
public class JpaAuditorAware implements AuditorAware<String> {
@Override
public String getCurrentAuditor() {
return "system";
}
}
这里是直接设置了一个默认值,正常来说,应该使用springsecurity或者shiro,从请求token中获取当前登录用户,如:
public final class SecurityUtils { private SecurityUtils() {} /**
* 根据 Authorization 获取当前登录的用户
*
* @return 返回用户id
*/
public static String getCurrentUserId() {
SecurityContext securityContext = SecurityContextHolder.getContext();
Authentication authentication = securityContext.getAuthentication();
String userId = null;
if (authentication != null) {
if (authentication.getPrincipal() instanceof UserDetails) {
UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal();
userId = springSecurityUser.getUsername();
} else if (authentication.getPrincipal() instanceof String) {
userId = (String) authentication.getPrincipal();
}
}
return userId;
}
} //设置Auditor
@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> { @Override
public String getCurrentAuditor() {
String userId= SecurityUtils.getCurrentUserId();
return userId;
}
}
3.新建 User类,继承BaseEntity
@Data
@Document(collection = "stu")
public class Stu extends BaseEntity
{ String name; String clazz; }
4.UserRepository 继承MongoRepository,连接mongo数据库
测试:
@RequestMapping("/user")
public User saveUser(String name) {
User user = new User();
user.setName(name);
return userRepo.save(user);
}
发现4个字段都自动赋值了。
但是有个问题,有些场景是这样的:
User user = new User();
user.setName(name);
user.setCreateUserId("hahaha");//手动设置userId
等执行完数据库插入后,发现createUserId的值不是hahaha,还是上面默认的system
解决方法:实现Auditable接口,通过重载来自定义这些方法
@Data
public class Base extends BaseEntity implements Auditable<String, String> { @Override
public String getCreatedBy() {
return this.getCreateUserId();
} @Override
public void setCreatedBy(String s) {
//如果已经设置了createUserId,则取当前设置的;否则,使用当前登录的用户id(即参数s) 下同。
String createUserId = !StringUtils.isEmpty(getCreateUserId()) ? getCreateUserId() : s;
setCreateUserId(createUserId);
} @Override
public DateTime getCreatedDate() {
return new DateTime(
this.getCreateTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
} @Override
public void setCreatedDate(DateTime dateTime) {
setCreateTime(
Instant.ofEpochMilli(dateTime.getMillis())
.atZone(ZoneId.systemDefault())
.toLocalDateTime());
} @Override
public String getLastModifiedBy() {
return this.getUpdateUserId();
} @Override
public void setLastModifiedBy(String s) {
String createUserId = !StringUtils.isEmpty(getUpdateUserId()) ? getUpdateUserId() : s;
setUpdateUserId(createUserId);
} @Override
public DateTime getLastModifiedDate() {
return new DateTime(
this.getUpdateTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
} @Override
public void setLastModifiedDate(DateTime dateTime) {
setUpdateTime(
Instant.ofEpochMilli(dateTime.getMillis())
.atZone(ZoneId.systemDefault())
.toLocalDateTime());
} @Override
public boolean isNew() {
return this.getId() == null;
}
}
测试:新建实体类stu,继承Base
@Data
@Document(collection = "stu")
public class Stu extends Base {
String name;
String clazz;
}
web rest类:
@RequestMapping("/stu")
public String saveStu(String name) throws JsonProcessingException {
Stu stu = new Stu();
stu.setName(name);
stu.setClazz(random.nextInt() + "");
stu.setCreateUserId(name);//自定义createUserId
stu = stuRepo.save(stu);
return om.writeValueAsString(stu);
}
jpa Auditor 自动赋值与自定义 @CreatedBy @LastModifiedBy @CreatedDate @LastModifiedDate的更多相关文章
- @CreatedDate@CreatedBy@LastModifiedBy@LastModifiedDate
启动类上加上@EnableJpaAuditing 实体类,注意需要加上@EntityListeners(AuditingEntityListener.class)这个注解才能使@CreatedDate ...
- 【js】将table的每个td的内容自动赋值给其title属性
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Spring data mongodb @CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy SpringSecurityAuditorAware,只记录用户名
要在Spring data mongodb 中使用@CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy 这四个注解 必须实现 SpringSecuri ...
- springboot~ObjectMapper~dto到entity的自动赋值
实体与Dto自动赋值 在开发的过程中,实体之间相互赋值是很正常的事,但是我们一般的方法都通过set和get方法来进行的,如果要赋值的字段少那还行,但是需要赋值的字段超过10个,那就是个灾难,你会看到整 ...
- JPA中自动使用@Table(name = "userTab")后自动将表名、列名添加了下划线的问题
一.问题 JPA中自动使用@Table(name = "userTab")后自动将表名.列名添加了下划线的问题,如下图: 二.解决 在application.properties文 ...
- PowerDesigner显示Common注释列并自动赋值
PowerDesigner中默认不显示Common注释列,可根据以下步骤显示并紫东填充Name列内容. 1.显示Common注释列 2.运行VB Script脚本自动赋值 使用Shift+Ctrl+X ...
- C#读取对象实例的值和对对象的属性自动赋值方法
using System; using System.Data; using System.Reflection; namespace DBUtility { /// <summary> ...
- 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制
第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用.自动限速.自定义spider的settings,对抗反爬机制 cookie禁用 就是在Scrapy的配置文件set ...
- 反射学习2-通过反射机制动态获取属性的值模拟Struts的自动赋值
一.准备知识: Java反射机制 处理事务的JavaBean String的操作常用方法 二.模拟步骤 这里我们通过反射机制动态获取属性的值模拟Struts中的自动赋值. 1.首先创建 ...
随机推荐
- 修改rpm中的文件重新打包
1.安装rpmrebuild 和安装rpmbuild rpmrebuild下载链接:https://sourceforge.net/projects/rpmrebuild/files/rpmrebui ...
- R语言学习——图形初阶之折线图与图形参数控制
plot()是R中为对象作图的一个泛型函数(它的输出将根据所绘制对象类型的不同而变化):plot(x,y,type="b")表示将x置于横轴,y置于纵轴,绘制点集(x,y),然后使 ...
- zabbix目录
1.Linux实战教学笔记49:Zabbix监控平台3.2.4(一)搭建部署与概述 2.Linux实战教学笔记50:Zabbix监控平台3.2.4(二)深入理解zabbix 3.Linux实战教学笔记 ...
- 【数据库】+ powerdesigner
使用powerdesigner工具对现有数据库表 生成关系图:https://www.cnblogs.com/lusunqing/p/4128025.html 通过Excel生成PowerDesign ...
- 挥舞的手臂(mixly+二次开发)
从vb6到vb.net,一路c#, java, python, nn, c,对技术的切换早已经没有害怕的感觉了,一直有的是技术的热情和我所认为的技术信仰. 扯完,开始正文. 看看效果图: 使用的是Ar ...
- git命令的理解与扩展
Git的模式如图: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Repository:仓库区(或本地仓库) 一.新建代码库 # 查看gi ...
- day11(函数参数,函数对象,打散机制,函数嵌套调用)
一,复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发 ...
- mysql一个非常实用解决sql查询优化的函数explain
前言: 项目中有个表有几万条数据,然后还要关联其他表,查询条件也有点多,再没有其他查询条件下,默认时间查询条件如果是查一年的数据的话,查询时间那是慢得可怕. 找总监去优化sql,看他用了一个sql函数 ...
- Python进阶10---魔术方法*
特殊属性 查看属性 #animal.py class Animal: x = 123 def __init__(self,name): self._name = name self.__age = 1 ...
- POJ2385——Apple Catching
$Apple~Catching$ Time Limit: 1000MS Memory Limit: 6553 ...