基于@LastModifiedDate不起作用的解决方案

 更新时间:2023年10月07日 09:10:23   作者:谁把我名字用了!  
这篇文章主要介绍了基于@LastModifiedDate不起作用的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

@LastModifiedDate不起作用

在实体中添加注解 @EntityListeners(AuditingEntityListener.class)监听实体变化

在自动更新时间戳字段增加 @LastModifiedDate

在Spring boot启动类增加注解 @EnableJpaAuditing启用JPA审计(自动填充默认值)

如果你是使用JPA的save(实体)方法去更新数据是没有问题的,如果是使用SQL/JPQL语句就会失效。

比如:

@Query("update xxx set x = ? where x = ?")

这里提供最简单的解决办法,语句里时间字段赋值CURRENT_TIMESTAMP即可。

JPA中@CreatedDate和@LastModifiedDate的使用

前些时间写了新项目,然后尝试使用了Spring Data JPA,发现新世界。很多功能都可以基于注解实现,为开发省去了不少功夫。

关于时间的生成注解@CreatedDate和@LastModifiedDate的使用,在此记录一下。

使用步骤

1.在实体类上加上注解 @EntityListeners(AuditingEntityListener.class),在相应的字段上添加对应的时间注解 @LastModifiedDate 和 @CreatedDate。

注意:日期的类型可以使用Date,也可以使用Long。我一般习惯用Date。

//@Data lombok注解,替我们生成getter和setter。
@Data
@Entity
@Table(name = "task")
@EntityListeners(AuditingEntityListener.class)
public class Task {
    /**
     * 自增主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "createTime", columnDefinition = "timestamp not null default current_timestamp")
    private Date createTime;
    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
    private Date updateTime;
}

2.在Application启动类中添加注解 @EnableJpaAuditing。

@EnableJpaAuditing
@SpringBootApplication
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    } 
}

3.除了上面提到的注解外,Spring Data JPA 还提供 @CreatedBy 和 @LastModifiedBy 注解,用于保存和更新当前操作用户的信息(如id、name)。

如果有这方面的需求,可以参考下面的配置实现

代码如下:

@Data
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Task {
      /**
     * 自增主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "createTime", columnDefinition = "timestamp not null default current_timestamp")
    private Date createTime;
    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
    private Date updateTime;
     /**
     * 创建人
     */
    @CreatedBy
    @Column(name = "createBy", columnDefinition = "varchar(255) not null")
    private String createBy;
    /**
     * 最后修改人
     */
    @LastModifiedBy
    @Column(name = "lastModifiedBy", columnDefinition = "varchar(255) not null")
    private String lastModifiedBy;
}

获取操作员信息

/**
 * Spring Data JPA通过AuditorAware<T>接口获取用户信息,
 * 其中泛型T可以为String保存用户名,也可以为Long/Integer保存用户ID。
 * @author EvanWang
 *
 */
@Component
public class AuditorConfig implements AuditorAware<String> {
    /**
     * 返回操作员标志信息
     *
     * @return
     */
    @Override
    public Optional<String> getCurrentAuditor() {
        // 这里应根据实际业务情况获取具体信息
        return Optional.of(userName);
    }
}

补充注解

Hibernate 也提供了类似上述时间注解的功能实现,这种方法只需要一步配置,更改为注解 @UpdateTimestamp 和 @CreationTimestamp 

代码如下:

@Data
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @UpdateTimestamp
    @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
    private Date updateTime;
    @CreationTimestamp
    @Column(name = "updateTime", columnDefinition = "timestamp not null default current_timestamp")
    private Date createTime;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 并发编程学习笔记之核心理论基础

    Java 并发编程学习笔记之核心理论基础

    编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的核心理论做了下小结
    2016-05-05
  • 深入理解Java中的并发工具类CountDownLatch

    深入理解Java中的并发工具类CountDownLatch

    CountDownLatch 作为 Java 中的一个同步工具类,用于在多线程间实现协调和控制,本文主要来和大家讲解一下JUC 工具类 CountDownLatch的使用,需要的可以参考一下
    2023-07-07
  • SpringBoot使用Log4j过程详解

    SpringBoot使用Log4j过程详解

    这篇文章主要介绍了SpringBoot使用Log4j过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Intellij IDEA如何去掉@Autowired 注入警告的方法

    Intellij IDEA如何去掉@Autowired 注入警告的方法

    这篇文章主要介绍了Intellij IDEA如何去掉@Autowired 注入警告的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java中的ArrayList集合源码解析

    Java中的ArrayList集合源码解析

    这篇文章主要介绍了Java中的ArrayList集合源码解析,ArrayList是一种以数组实现的List,与数组相比,它具有动态扩展的能力,因此也可称之为动态数组,需要的朋友可以参考下
    2023-12-12
  • Idea Jrebel 报错:Cannot reactivate,offline seat in use

    Idea Jrebel 报错:Cannot reactivate,offline 

    本文主要介绍了Idea Jrebel 报错:Cannot reactivate,offline seat in use,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java中的SynchronousQueue阻塞队列及使用场景解析

    Java中的SynchronousQueue阻塞队列及使用场景解析

    这篇文章主要介绍了Java中的SynchronousQueue阻塞队列及使用场景解析,SynchronousQueue 是 Java 中的一个特殊的阻塞队列,它的主要特点是它的容量为0,这意味着 SynchronousQueue不会存储任何元素,需要的朋友可以参考下
    2023-12-12
  • Java简单获取字符串像素的方法

    Java简单获取字符串像素的方法

    这篇文章主要介绍了Java简单获取字符串像素的方法,涉及Java针对字符串字体操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Spring Boot 校验用户上传的图片文件(两种方式)

    Spring Boot 校验用户上传的图片文件(两种方式)

    图片上传是现代应用中非常常见的一种功能,也是风险比较高的一个地方,恶意用户可能会上传一些病毒、木马,本文给大家介绍两种对图片文件进行校验的方法,感兴趣的朋友一起看看吧
    2023-11-11
  • IDEA中Git的基本应用详解

    IDEA中Git的基本应用详解

    这篇文章主要介绍了IDEA中Git的基本应用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论