1. 程式人生 > 其它 >Spring data 如何定義預設時間與日期

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;