Jpa 实现自动更新表中的创建日期和修改时间

 更新时间:2021年01月29日 16:43:43   作者:miskss  
这篇文章主要介绍了Jpa 实现自动更新表中的创建日期和修改时间,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

一般来说创建时间和修改时间 两个字段是一个实体类必备的。

在阿里Java开发手册中也对此的说明:

【强制】表必备三字段:id, create_time, update_time。

说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。create_time, update_time 的类型均为 datetime 类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。

mysql 实现添加时间自动添加更新时间自动更新

在JPA 中也是支持新的数据保存是自动写入创建时间,当数据有修改时 自动记录修改时间。在SpringBoot 的启动类上加 @EnableJpaAuditing 来开启时间的支持, 在字段上使用 @CreatedDate 和@LastModifiedDate 注解来即可完成时间的自动更新。

实例:

@EnableJpaAuditing
@SpringBootApplication
public class StudentApplication {
 public static void main(String[] args) {
 SpringApplication.run(StudentApplication.class, args);
 }
}
@EntityListeners(value = AuditingEntityListener.class)
@Getter
@Setter
@Entity
public class StudentEntity {
 ....
 @CreatedDate
 @Column(nullable = false, updatable = false)
 private LocalDateTime createTime;
 @LastModifiedDate
 @Column()
 private LocalDateTime updateTime;
 ...
}

由于这两个字段所有实体类都有,所以可以将它们抽取到一个通用的类里面,其他实体类需要时直接继承即可。

/**
 * 所有类的超类
 * 自动更新创建时间和更新时间
 *
 * @author peter
 *
 **/
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
@Getter
@Setter
public abstract class AbstractBaseTimeEntity {
 @CreatedDate
 @Column(nullable = false, updatable = false)
 private LocalDateTime createTime;
 @LastModifiedDate
 @Column()
 private LocalDateTime updateTime;
}
@Entity
@Data
public class StudentEntity extends AbstractBaseTimeEntity {
 ....
}

补充:Jpa配置实体类创建时间更新时间自动赋值,@CreateDate,@LastModifiedDate

操作数据库映射实体类时,通常需要记录createTime和updateTime,如果每个对象新增或修改去都去手工操作创建时间、更新时间,会显得比较繁琐。

Springboot jpa提供了自动填充这两个字段的功能,简单配置一下即可。@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy前两个注解就是起这个作用的,后两个是设置修改人和创建人的,这里先不讨论。

首先,我们的很多实体类都是需要创建时间和更新时间的,我们不想在每个实体类里都去定义这两个字段,那么我们把它抽取到基类中,让实体类去继承它。

package com.tianyalei.testautotime.entity;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
/**
 * Created by wuwf on 17/4/21.
 */
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 protected Integer id;
@CreatedDate
private Long createTime;
@LastModifiedDate
private Long updateTime;
public Integer getId() {
 return id;
}
public void setId(Integer id) {
 this.id = id;
}
public Long getCreateTime() {
 return createTime;
}
public void setCreateTime(Long createTime) {
 this.createTime = createTime;
}
public Long getUpdateTime() {
 return updateTime;
}
public void setUpdateTime(Long updateTime) {
 this.updateTime = updateTime;
}
}

AuditingEntityListener标签开启后,下面的时间标签才会生效。

然后还需要在启动类加上@EnableJpaAuditing注解。

做完这些,我们来测试一下,新建个Springboot项目,配置一下数据库信息

spring:
 jpa:
 database: mysql
 show-sql: true
 hibernate:
  ddl-auto: update
 datasource:
  type: com.alibaba.druid.pool.DruidDataSource
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://localhost:3306/test
  username: root
  password:

新建个普通的实体类。

package com.tianyalei.testautotime.entity;
import javax.persistence.Entity;
@Entity
public class Post extends BaseEntity {
private String title;
public String getTitle() {
 return title;
}
public void setTitle(String title) {
 this.title = title;
}
}

测试类:

import com.tianyalei.testautotime.entity.Post;
import com.tianyalei.testautotime.repository.PostRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestautotimeApplicationTests {
 @Autowired
 PostRepository postRepository;
@Test
public void save() {
 Post post = new Post();
 post.setTitle("title0");
 postRepository.save(post);
}
// @Test
// public void update() {
//  Post post = postRepository.findOne(1);
//  post.setTitle(“title1”);
//  postRepository.save(post);
// }
}

先试试新增。

可以看到已经被自动赋值了。

然后试试update,将上面的update的注释放开。

可以看到更新时间也自动修改了。

需注意,如果你没有修改任何字段的值的话,即便走了save方法,updateTime也是不会更改的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • 搭建一个基础的Resty项目框架

    搭建一个基础的Resty项目框架

    这篇文章主要为大家介绍了如何搭建一个基础的Resty项目框架示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 深入理解Spring AOP

    深入理解Spring AOP

    这篇文章主要介绍了深入理解Spring AOP,详细的介绍了spring aop的具体实现与理论
    2017-01-01
  • 基于java Servlet编码/异常处理(详解)

    基于java Servlet编码/异常处理(详解)

    下面小编就为大家带来一篇基于java Servlet编码/异常处理(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 详解MyBatis特性之动态SQL

    详解MyBatis特性之动态SQL

    动态 SQL 是 MyBatis 的强大特性之一,这篇文章我们将结合动态SQL完成更加复杂的 SQL 操作,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • 解决java.lang.ClassCastException的java类型转换异常的问题

    解决java.lang.ClassCastException的java类型转换异常的问题

    这篇文章主要介绍了解决java.lang.ClassCastException的java类型转换异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java多线程 生产者消费者模型实例详解

    Java多线程 生产者消费者模型实例详解

    这篇文章主要介绍了Java多线程 生产者消费者模型实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java8 stream 操作map根据key或者value排序的实现

    java8 stream 操作map根据key或者value排序的实现

    这篇文章主要介绍了java8 stream 操作map根据key或者value排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • idea中maven项目模块变成灰色原因及解决方案

    idea中maven项目模块变成灰色原因及解决方案

    这篇文章主要介绍了idea中maven项目模块变成灰色原因及解决方案,文中通过图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • Java使用抽象工厂模式实现的肯德基消费案例详解

    Java使用抽象工厂模式实现的肯德基消费案例详解

    这篇文章主要介绍了Java使用抽象工厂模式实现的肯德基消费案例,较为详细的分析了抽象工厂模式的定义、原理并结合实例形式分析了Java使用抽象工厂模式实现肯德基消费案例的步骤与相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • SpringCloud之Hystrix的详细使用

    SpringCloud之Hystrix的详细使用

    熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的相应信息,本文重点给大家介绍SpringCloud Hystrix使用,感兴趣的朋友一起看看吧
    2022-01-01

最新评论