Spring data 如何定义默认时间与日期

本文节选自《Netkiller Java 手札》 作者:netkiller, 出处:http://www.netkiller.cn/java/index.html

10.1.6. 默认时间规则

10.1.6.1. CreatedDate

Spring 提供了 import org.springframework.data.annotation.CreatedDate;

但是这些只能作用于实体类。

@CreatedDate
    private Date createdDateTime;

10.1.6.3. 数据库级别的默认创建日期时间定义

package cn.netkiller.api.domain.elasticsearch;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;@Entity@Tablepublic class ElasticsearchTrash {	@Id
	private int id;	@Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")	private Date ctime;	public int getId() {		return id;
	}	public void setId(int id) {		this.id = id;
	}	public Date getCtime() {		return ctime;
	}	public void setCtime(Date ctime) {		this.ctime = ctime;
	}

}

对应数据库DDL

CREATE TABLE `elasticsearch_trash` (  `id` int(11) NOT NULL,  `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

10.1.6.4. 数据库级别的默认创建日期与更新时间定义

需求是这样的:

1. 创建时间与更新时间只能由数据库产生,不允许在实体类中产生,因为每个节点的时间/时区不一定一直。另外防止人为插入自定义时间时间。

2. 插入记录的时候创建默认时间,创建时间不能为空,时间一旦插入不允许日后在实体类中修改。

3. 记录创建后更新日志字段为默认为 null 表示该记录没有被修改过。一旦数据被修改,修改日期字段将记录下最后的修改时间。

4. 甚至你可以通过触发器实现一个history 表,用来记录数据的历史修改,详细请参考作者另一部电子书《Netkiller Architect 手札》数据库设计相关章节。

package cn.netkiller.api.domain.elasticsearch;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;import javax.validation.constraints.Null;@Entity@Tablepublic class ElasticsearchTrash {	@Id
	private int id;	// 创建时间
	@Column(insertable = false, updatable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")	private Date ctime;	
	// 修改时间
	@Column(nullable = true, insertable = false, updatable = false, columnDefinition = "TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP")	private Date mtime;	public int getId() {		return id;
	}	public void setId(int id) {		this.id = id;
	}	public Date getCtime() {		return ctime;
	}	public void setCtime(Date ctime) {		this.ctime = ctime;
	}	public Date getMtime() {		return mtime;
	}	public void setMtime(Date mtime) {		this.mtime = mtime;
	}

}

对应数据库DDL

CREATE TABLE `elasticsearch_trash` (  `id` int(11) NOT NULL,  `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,  `mtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

10.1.6.5. 最后修改时间

需求:记录最后一次修改时间

package cn.netkiller.api.domain.elasticsearch;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity@Tablepublic class ElasticsearchTrash {	@Id
	private int id;	@Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
	private Date lastModified;

}

产生DDL语句如下

CREATE TABLE `elasticsearch_trash` (  `id` int(11) NOT NULL,  `ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

原文发布于微信公众号 - Netkiller(netkiller-ebook)

原文发表时间:2017-08-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WindCoder

Discuz数据库security_failedlog错误及修复

最近跑了之前的论坛转了转,发现一直在报数据库中表security_failedlog错误,百度了好久,最终找到解决方案。

1971
来自专栏性能与架构

Mysql group by实现方式(一) - 临时表

当MySQL Query Optimizer无法找到可以利用的合适索引时,就不得不先读取需要的数据,然后通过临时表来完成GROUP BY操作 例如 EXPLAI...

2706
来自专栏Python

异常处理:1215 - Cannot add foreign key constraint

  最近在做新生入学系统,学生表中包括新生的班级,专业等信息,班级,专业就需要和班级表,专业表进行关联,但是在添加外键的过程中却出现了“Cannot add f...

20910
来自专栏游戏杂谈

Node.js调用mysql的存储过程

例子仅在windows下测试通过,没有放在linux下测试。如有问题,可以电邮给我~

921
来自专栏乐沙弥的世界

Oracle 测试常用表BIG_TABLE

创建测试用表,DBA经常用到,通常都是基于dba_objects来创建的比较多。本文根据Tom大师的big_table进行了整理,供大家参考。

782
来自专栏性能与架构

Mysql Query Cache的基本原理

Query Cache是根据SQL语句来cache的,一个SQL查询如果以select开头,那么MySQL将尝试对其进行缓存 每个Cache都是以完整的SQL...

3285
来自专栏别先生

MYSQL中约束及修改数据表

MYSQL中约束及修改数据表 28:约束 约束保证数据的完整性和一致性 约束分为表级约束和列级约束 约束类型包括:     NOT NULL(非空约束)   ...

1998
来自专栏LanceToBigData

MySQL(八)之DML

昨天晚上很晚的时候才写完MySQL的常用函数,今天给大家讲一下MySQL的DML。接下来让我们直接来学习了,今天感冒了。身体很难受下午的时候要去买一波药了,不然...

1869
来自专栏有趣的django

14.MySQL(二) 数据之表操作表内容操作Mysql 连接事务外键

数据之表操作 1.创建表 语法:CREATE TABLE table_name (column_name column_type); create table...

3469
来自专栏C/C++基础

MySQL如何将select子查询结果横向拼接后插入数据表中

除了最后一列默认是当前时间戳,每一列的结果都是一个select查询结果。如何将查询的结果合并成一条记录插入到上面的数据表中呢?网上也没有确切的答案,摸索了很久,...

1052

扫码关注云+社区