Jpa 实现自动更新表中的创建日期和修改时间
一般来说创建时间和修改时间两个字段是一个实体类必备的。
在阿里Java开发手册中也对此的说明:
【强制】表必备三字段:id,create_time,update_time。
说明:其中id必为主键,类型为bigintunsigned、单表时自增、步长为1。create_time,update_time的类型均为datetime类型,前者现在时表示主动式创建,后者过去分词表示被动式更新。
mysql实现添加时间自动添加更新时间自动更新
在JPA中也是支持新的数据保存是自动写入创建时间,当数据有修改时自动记录修改时间。在SpringBoot的启动类上加@EnableJpaAuditing来开启时间的支持,在字段上使用@CreatedDate和@LastModifiedDate注解来即可完成时间的自动更新。
实例:
@EnableJpaAuditing @SpringBootApplication publicclassStudentApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(StudentApplication.class,args); } } @EntityListeners(value=AuditingEntityListener.class) @Getter @Setter @Entity publicclassStudentEntity{ .... @CreatedDate @Column(nullable=false,updatable=false) privateLocalDateTimecreateTime; @LastModifiedDate @Column() privateLocalDateTimeupdateTime; ... }
由于这两个字段所有实体类都有,所以可以将它们抽取到一个通用的类里面,其他实体类需要时直接继承即可。
/** *所有类的超类 *自动更新创建时间和更新时间 * *@authorpeter * **/ @MappedSuperclass @EntityListeners(value=AuditingEntityListener.class) @Getter @Setter publicabstractclassAbstractBaseTimeEntity{ @CreatedDate @Column(nullable=false,updatable=false) privateLocalDateTimecreateTime; @LastModifiedDate @Column() privateLocalDateTimeupdateTime; } @Entity @Data publicclassStudentEntityextendsAbstractBaseTimeEntity{ .... }
补充:Jpa配置实体类创建时间更新时间自动赋值,@CreateDate,@LastModifiedDate
操作数据库映射实体类时,通常需要记录createTime和updateTime,如果每个对象新增或修改去都去手工操作创建时间、更新时间,会显得比较繁琐。
Springbootjpa提供了自动填充这两个字段的功能,简单配置一下即可。@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy前两个注解就是起这个作用的,后两个是设置修改人和创建人的,这里先不讨论。
首先,我们的很多实体类都是需要创建时间和更新时间的,我们不想在每个实体类里都去定义这两个字段,那么我们把它抽取到基类中,让实体类去继承它。
packagecom.tianyalei.testautotime.entity; importorg.springframework.data.annotation.CreatedDate; importorg.springframework.data.annotation.LastModifiedDate; importorg.springframework.data.jpa.domain.support.AuditingEntityListener; importjavax.persistence.*; /** *Createdbywuwfon17/4/21. */ @MappedSuperclass @EntityListeners(AuditingEntityListener.class) publicabstractclassBaseEntity{ @Id @GeneratedValue(strategy=GenerationType.AUTO) protectedIntegerid; @CreatedDate privateLongcreateTime; @LastModifiedDate privateLongupdateTime; publicIntegergetId(){ returnid; } publicvoidsetId(Integerid){ this.id=id; } publicLonggetCreateTime(){ returncreateTime; } publicvoidsetCreateTime(LongcreateTime){ this.createTime=createTime; } publicLonggetUpdateTime(){ returnupdateTime; } publicvoidsetUpdateTime(LongupdateTime){ 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:
新建个普通的实体类。
packagecom.tianyalei.testautotime.entity; importjavax.persistence.Entity; @Entity publicclassPostextendsBaseEntity{ privateStringtitle; publicStringgetTitle(){ returntitle; } publicvoidsetTitle(Stringtitle){ this.title=title; } }
测试类:
importcom.tianyalei.testautotime.entity.Post; importcom.tianyalei.testautotime.repository.PostRepository; importorg.junit.Test; importorg.junit.runner.RunWith; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.boot.test.context.SpringBootTest; importorg.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest publicclassTestautotimeApplicationTests{ @Autowired PostRepositorypostRepository; @Test publicvoidsave(){ Postpost=newPost(); post.setTitle("title0"); postRepository.save(post); }
//@Test //publicvoidupdate(){ //Postpost=postRepository.findOne(1); //post.setTitle(“title1”); //postRepository.save(post); //} }
先试试新增。
可以看到已经被自动赋值了。
然后试试update,将上面的update的注释放开。
可以看到更新时间也自动修改了。
需注意,如果你没有修改任何字段的值的话,即便走了save方法,updateTime也是不会更改的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。