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 条评论
登录 后参与评论

相关文章

来自专栏GreenLeaves

Oracle 表复杂查询之多表合并查询

本文使用到的是oracle数据库scott方案所带的表,scott是oracle数据库自带的方案,使用前请确保其解锁 ? Oracle合并查询一共有四种方式,分...

1796
来自专栏lgp20151222

MySQL使用判断

在第一个方案的返回结果中, value=compare-value。而第二个方案的返回结果是第一种情况的真实结果。如果没有匹配的结果值,则返回结果为ELSE后的...

902
来自专栏Dato

浅谈 DML、DDL、DCL的区别

一、DML DML(data manipulation language)数据操纵语言:     就是我们最经常用到的 SELECT、UPDATE、INSERT...

3447
来自专栏栗霖积跬步之旅

第四章:数据检索

表名:products 字段:product_id、product_name、product_price、vend_id(供应商) 1.检索单个列: SELEC...

17310
来自专栏抠抠空间

MySQL之单表查询

一、单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY fiel...

2967
来自专栏高爽的专栏

INSERT ... ON DUPLICATE KEY UPDATE

向数据库插入记录时,有时会有这种需求,当符合某种条件的数据存在时,去修改它,不存在时,则新增,也就是insertOrUpdate操作。这种控制可以放...

1800
来自专栏有趣的django

15.MySQL(三) 索引类型

索引类型 先创建表 mysql> CREATE TABLE test( -> id INT, -> username VARCHAR(16), ...

30812
来自专栏全栈工程师成长之路

深入浅出后端开发(SQL指令笔记)

3067
来自专栏李家的小酒馆

SQL基本语法

SQL 基本语法 表库操作 创建表 create table 表名( 字段名 类型(长度) 约束, 字段名 类型(长度)...

1740
来自专栏个人随笔

sql sever分组查询和连接查询

分组查询 select 查询信息 from 表名 where 条件 group by 按照列分组(可多个 ,隔开) order by 排序方式 (查询信息如果列...

2385

扫描关注云+社区