操作数据库映射实体类时,通常需要记录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;@CreatedDateprivate Long createTime;@LastModifiedDateprivate 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: mysqlshow-sql: truehibernate:ddl-auto: updatedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: rootpassword:
新建个普通的实体类。
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 {@AutowiredPostRepository postRepository;@Testpublic 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也是不会更改的。