为了实现在JPA保存记录时,自动更新lastupdatetime和createtime字段,在网上搜索了一下,大多是要使用spring-data-jpa的JpaAuditing功能。这个功能的实现方法如下:
1. 启动类添加:
@EnableJpaAuditing
2. Entity 类添加如下:
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditTest{
@CreatedDate
@Temporal(TIMESTAMP)
private Date createTime;
@LastModifiedDate
@Temporal(TIMESTAMP)
private Date updateTime;
}
这个方法虽然可以实现,但它一是要依赖于spring-data-jpa,如果纯粹使用JPA就不行,二是如果记录量很大,分布式系统中,各服务器的时间会有差异,所以我研究了一下,只用数据库和JPA自身的功能实现自动更新lastupdatetime和createtime字段。现分享出来:
1 Entity 类添加如下:
@Entity
public class AuditTest{
@Column(updatable = false, insertable=false)
@Temporal(TIMESTAMP)
private Date createTime;
@Column(updatable = false, insertable=false)
@Temporal(TIMESTAMP)
private Date updateTime;
}
这个是要添加申明,让JPA在更新和新增时,都不要更新这两个字段,让数据库自动维护这两个字段。
2 数据库表:
CREATE TABLE `audit_test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
...
`receive_time` datetime DEFAULT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
这一步是让数据库自动维护这两个字段。
这样,JPA在新增和更新时,不会更新相关字段,数据库自动维护这两个字段的值。
后记:后来我们想要把日志时间精确到毫秒,但无法自动填充为CURRENT_TIMESTAMP,经过研究,解决方法见:
MySQL精确到毫秒/微秒 DateTime(3),DateTime(6) 自动缺省值