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也是不会更改的。

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

以上是 Jpa 实现自动更新表中的创建日期和修改时间 的全部内容, 来源链接: utcz.com/z/353652.html

回到顶部