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


声明:本文转载自https://my.oschina.net/neochen/blog/1512611,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

本文节选自《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 @Table public 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 @Table public 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 @Table public 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;

 

本文发表于2017年08月18日 12:36
(c)注:本文转载自https://my.oschina.net/neochen/blog/1512611,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2534 讨论 1 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1