Spring @Audited 审计——‘createdBy’,‘createdDate’,‘lastModifiedBy’和‘lastModifiedDate’

原创性声明:本文完全为笔者原创,请尊重笔者劳动力。转载务必注明原文地址。

这是一个很常见的需求 :

例如。简书数据库中,文章表(articles)中的某条记录是被那个账号创建的(@CreateBy),最后的一次更新是哪个账号干的(@LastModifiedBy),以及创建的时间是什么(@CreateDate),最后更新的时间又是什么(@LastModifiedDate)?

这既可以作为用户所需要的字段信息,在一定程度上也是一种操作记录的体现。当然,这样的功能,完全可以自己在CRUD操作的时候去实现,但是秉持着程序的精简性和可靠性,用Spring 的@Audited自然是一种更好的方法了。

Spring审计功能简单易用(我的项目建立在Spring boot之上)。

假设我们的domain包下,有一个抽象的审计超类——AbstractAuditingEntity,其他的实体类都继承它。


@MappedSuperclass
@Audited
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractAuditingEntity {

      @CreatedBy
      @Column(name = "created_by", nullable = false, length = 50, updatable = false)
      @JsonIgnore
      private String createdBy;

      @CreatedDate
      @Column(name = "created_date", nullable = false, updatable = false)
      @JsonIgnore
      private LocalDateTime createdDate = LocalDateTime.now();

      @LastModifiedBy
      @Column(name = "last_modified_by", length = 50)
      @JsonIgnore
      private String lastModifiedBy;

      @LastModifiedDate
      @Column(name = "last_modified_date")
      @JsonIgnore
      private LocalDateTime lastModifiedDate = LocalDateTime.now();

      // 省略对应的 set/get 方法......
}

简单讲一下类上三个注解的作用。

@MappedSuperclass API文档是这么写的: 指定一个类,其映射信息应用于从其继承的实体。 映射的超类没有为它定义的单独的表。使用MappedSuperclass注释指定的类可以以与实体相同的方式进行映射,除了映射将仅应用于其子类,因为映射的超类本身没有表。(谷歌翻译)翻译的虽然不是非常顺口,但大致还是能看懂的。意思就是说,应用这个注解的类(比如上面例子的AbstractAuditingEntity)在数据库里是没有表与它对应的,但是它的属性(这里的四个属性),将会被继承的子类所继承,并映射到子类在数据库中对应的这四个字段。那么显而易见,这个注解可以把众多实体类的公共属性提取出来,这也是此处的作用。
@Audited API文档是这么写的: 当应用于类时,表示其所有属性都应该被审计。 当应用于一个字段时,表示该字段应该被审计。没什么好解释的,谷歌这个翻译,很6。
@EntityListeners(AuditingEntityListener.class) 指定要用于实体或映射超类的回调侦听器类。 此注释可以应用于实体类或映射超类。相当于给当前的超类注册一个监听器,注册给谁呢,就是Spring提供的AuditingEntityListener这个类,从名字上看就大概揣测一二这个监听器的作用,监听一个实体创建或更新时的审计用的。

显然这三个注解都是必不可少的,当然如果不把公共实体抽取出来,而是在某个具体的类上(如Article)使用这些注解和声明定义这四个属性,那么@MappedSuperclass就没有必要了。

至于@CreatedBy@CreatedDate@LastModifiedBy@LastModifiedDate,那就对号入座了。

@JsonIgnore : 忽略改字段的序列化和反序列化。这么做,客户端将不会获得该字段。

这么做还是不够的,如果我们没有在JPA操作中启用审计功能的话。启用的方法很简单,只需要在主类上加上启用的注解即可:

@SpringBootApplication
@EnableJpaAuditing //在JPA操作中启用审计功能
public class Application 
{
    public static void main( String[] args )
    {
        SpringApplication.run(Application.class, args);
    }
}

跑起来我们会发现。createBylastModifiedBy的值并不会被相应地自动填上。因此我们还少了一个步骤——实现AuditorAware接口,并实现getCurrentAuditor方法,不然程序不知道创建者和最后修改者怎么给值。

@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {

  @Override
  public String getCurrentAuditor() {
    // TODO 返回当前session会话中的账户名即可
  }
}

getCurrentAuditor方法中也体现了记录createdBylastModifiedBy的策略(包括是保存操作者用户名,还是电话号码或其他信息),一般情况下,当然是返回session中的账户信息(通常是账户名),因为肯定是这个账户修改的对应数据。

如此一来,在对普通实体类的CRUD操作时,便不用操心某条记录是谁创建的、啥时候创建的,又是谁最后一次更新的,最后一次更新是啥时候这样的破事儿了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,803评论 6 342
  • 此篇翻译的是Spring Boot官方指南 Part III. 使用 Spring Boot (Using Spr...
    K天道酬勤阅读 6,747评论 0 21
  • 风的那边埋葬着两个诗人一个热爱生活 向往幸福用诗篇记录岁月一个怀疑世界 倾心死亡用诗篇遗忘过去然而没有...
    子健阅读 793评论 1 7
  • 1.描述 The count-and-say sequence is the sequence of intege...
    YellowLayne阅读 267评论 0 0