日期时间JPA映射

数据库日期时间类型

以MySQL为例,Date类型存储日期,Time类型存储时间,DateTime存储日期时间。对应的,这三个MySQL数据库字段类型在实体类的类型分别是java.sql.Date,java.sql.Time,java.sql.Timestamp。

Date类型

数据库表

在MySQL创建表student,字段CreateTime表示记录创建时间,仅仅存储时间。

CREATE TABLE `Student` (
  `StudentId` bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `Name` varchar(100) NOT NULL,
  `CreateTime` date NOT NULL,
  PRIMARY KEY (`StudentId`),
  KEY `StudentName` (`Name`)
) ENGINE=InnoDB;

实体类

数据库表student的字段CreateTime是Date类型,对应的,实体类的属性createTime是java.sql.Date类型。

package com.gxz.entities;

import java.sql.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class Student {
	private long id;
	private String name;
	private Date createTime;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "StudentId")
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

}

持久化

Student student = new Student();
student.setName("张三");
student.setCreateTime(new Date(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01").getTime()));

manager.persist(student);

查看数据库表student的数据,如下所示。

若把持久化的时间代码修改成2016-01-01 01:01:01,持久化的效果依旧不会保存时间,因为字段CreateTime的Date类型只会保存日期,属性java.sql.Date类型只会保存日期。

Student student = new Student();
student.setName("张三");
student.setCreateTime(new Date(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-01-01 01:01:01").getTime()));

manager.persist(student);

持久化后,查看数据库表student的数据,如下所示。

若把数据库表student字段CreateTime的类型修改为DateTime,使之可以保存日期时间,但是,因为属性java.sql.Date类型只会保存日期,所以,该列的时间部分依旧全部为0。首先,我们修改数据库。

CREATE TABLE `Student` (
  `StudentId` bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `Name` varchar(100) NOT NULL,
  `CreateTime` datetime NOT NULL,
  KEY `StudentName` (`Name`)
) ENGINE=InnoDB;

持久化的时间代码如下所示。

student.setCreateTime(new Date(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01").getTime()));

持久化后,查看数据库表student的数据,如下所示。

持久化的时间代码如下所示。

student.setCreateTime(new Date(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-01-01 01:01:01").getTime()));

持久化后,查看数据库表student的数据,如下所示。

DateTime类型

数据库表

把数据库表student字段CreateTime的类型修改为DateTime,使之可以保存日期时间。

实体类

数据库表student的字段CreateTime是DateTime类型,对应的,实体类的属性createTime是java.sql.Timestamp类型。

package com.gxz.entities;

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class Student {
	private long id;
	private String name;
	private Timestamp createTime;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "StudentId")
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Timestamp getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Timestamp createTime) {
		this.createTime = createTime;
	}
}

持久化

Student student = new Student();
student.setName("张三");
student.setCreateTime(new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-01-02 02:01:01").getTime()));

manager.persist(student);

持久化后,查看数据库表student的数据,如下所示。

Time类型

数据库表

把数据库表student字段CreateTime的类型修改为time,仅仅可以保存时间。

CREATE TABLE `Student` (
  `StudentId` bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `Name` varchar(100) NOT NULL,
  `CreateTime` time NOT NULL,
  KEY `StudentName` (`Name`)
) ENGINE=InnoDB;

实体类

数据库表student的字段CreateTime是time类型,对应的,实体类的属性createTime是java.sql.Time类型。

package com.gxz.entities;

import java.sql.Time;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class Student {
	private long id;
	private String name;
	private Time createTime;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "StudentId")
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Time getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Time createTime) {
		this.createTime = createTime;
	}
}

持久化

Student student = new Student();
student.setName("张三");
student.setCreateTime(new Time(new SimpleDateFormat("HH:mm:ss").parse("02:01:01").getTime()));

manager.persist(student);

持久化后,查看数据库表student的数据,如下所示。

实体类属性是java.util.Calendar或java.util.Date

如果实体类属性是java.util.Calendar或java.util.Date,需要把这种类型转化为java.sql.Time、java.sql.Timestamp、java.sql.Date。实现转化的注解是javax.persistence.Temporal,该注解有一个属性javax.persistence.TemporalType,取值分别是TemporalType.DATE、TemporalType.TIME、TemporalType.TIMESTAMP。具体转化关系如下所述。

1.TemporalType.DATE:把java.util.Calendar或java.util.Date转化为java.sql.Date(持久化实体时),或把java.sql.Date转化为java.util.Calendar或java.util.Date(获取实体时)。

2.TemporalType.TIME:把java.util.Calendar或java.util.Date转化为java.sql.Time(持久化实体时),或把java.sql.TIME转化为java.util.Calendar或java.util.Time(获取实体时)。

3.TemporalType.TIMESTAMP:把java.util.Calendar或java.util.Date转化为java.sql.Timestamp(持久化实体时),或把java.sql.Timestamp转化为java.util.Calendar或java.util.Time(获取实体时)。

数据库表(DateTime类型)

数据库表student的字段CreateTime是DateTime类型。

实体类(Calendar类型)

实体类的属性是createTime的类型是java.util.Calendar,需要把java.util.Calendar转化为java.sql.Timestamp。

package com.gxz.entities;

import java.util.Calendar;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table
public class Student {
	private long id;
	private String name;
	private Calendar createTime;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "StudentId")
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Temporal(TemporalType.TIMESTAMP)
	public Calendar getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Calendar createTime) {
		this.createTime = createTime;
	}

}

持久化(Calendar类型)

Student student = new Student();
student.setName("张三");
Calendar calendar = Calendar.getInstance();
calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-05-12 12:25:23"));
student.setCreateTime(calendar);

持久化后,查看数据库表student的数据,如下所示。

数据库表(Date类型)

数据库表student的字段CreateTime是Date类型。

实体类(java.util.Date类型)

实体类的属性是createTime的类型是java.util.Date,需要把java.util.Date转化为java.sql.Date。

package com.gxz.entities;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table
public class Student {
	private long id;
	private String name;
	private Date createTime;

	@Temporal(TemporalType.DATE)
	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "StudentId")
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

持久化(java.util.Date类型)

Student student = new Student();
student.setName("张三");
student.setCreateTime(new SimpleDateFormat("yyyy-MM-dd").parse("2016-05-13"));

manager.persist(student);

持久化后,查看数据库表student的数据,如下所示。

时间: 2024-11-05 18:49:59

日期时间JPA映射的相关文章

Hibernate @Temporal 注解处理Java与Mysql时间日期类型的映射关系

2017-4-2 在 Java 中使用 java.util.Date 和 java.util.Calendar 表示时间.日期类型.在 Mysql 中使用 YEAR.DATE.TIME.TIMESTAMP.DATETIME 五种数据类型表示时间日期,由此引出了 Java 日期类型跟数据库的日期类型怎么映射的问题.本文总结了使用 Hibernate @Temporal 注解的解决方案. 使用 @Temporal 注解修饰 Java 实体类的数据类型 指定 @Temporal value 属性,其中

组合主键及JPA映射

组合主键 主键最常见的是单字段主键,组合主键使用两个及以上的字段作为主键,常用于多个字段能唯一标示一条记录的表.比如,股票数据表,股票代码.日期和收盘价作为主键.每支股票,在一个特定日期,只能有一个收盘价. 数据库管理系统使用MySQL,创建一个具有组合主键的表Person. CREATE TABLE PERSON ( name VARCHAR(255) NOT NULL, age BIGINT UNSIGNED NOT NULL, adress VARCHAR(255) , PRIMARY K

Linux学习汇总——Linux文件系统标准,日期时间和文件目录管理命令

Linux相关知识点 家目录,主目录 home directory #ls  -l /root    显示/root 列表 dr-xr-xr-x.   2 root root  4096 Nov  4 05:58  install.log.syslog  (各项参数含义如下) d                rw-r--r--.           1                          root         root                 3482        

Java日期时间(Date/Time)

获取当前日期和时间 在Java中容易得到当前的日期和时间.可以使用一个简单的Date对象的toString()方法,如下所示打印当前日期和时间: import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date using toStr

JavaScript日期时间对象的创建与使用(三)

时钟效果一: 代码: <html> <head> <meta charset="utf-8"/> <title>JavaScript日期时间对象的创建与使用</title> </head> <body> <h2 id="time"></h2> <script type="text/javascript"> function Cl

FreeMarker中的日期时间处理

1. FreeMarker中的日期时间格式设置 FreeMarker中可以分别对date.time.datetime三种类型的日期时间设置格式,例如: config.setDateTimeFormat("yyyy-MM-dd HH:mm:ss"); config.setDateFormat("yyyy-MM-dd"); config.setTimeFormat("HH:mm:ss"); 当我们对一个页面变量使用 ?date ?time ?date

Linux日期时间显示输出

1.输出当前年月日 echo $(date +%F) 2014-02-21 2.输出当前时间(时分) echo $(date +%R) 12:45 3.输出当前时间(时分秒) echo $(date +%T) 12:52:51 4.输出星期 echo $(date +%A) 星期五 5.组合输出日期时间 5.1输出年月日 echo $(date +%Y/%m/%d) 2014/02/21 %Y参数: 年 %m参数: 月 %d参数: 日 5.2输出时分秒 echo $(date +%H:%M:%S

c/c++日期时间处理与字符串string转换

在c/c++实际问题的编程中,我们经常会用到日期与时间的格式,在算法运行中,通常将时间转化为int来进行计算,而处理输入输出的时候,日期时间的格式却是五花八门,以各种标点空格相连或者不加标点. 首先,在c中,是有一个标准的日期时间结构体的,在标准库wchar.h内,我们可以看到结构体tm的声明如下: 1 #ifndef _TM_DEFINED 2 struct tm { 3 int tm_sec; /* seconds after the minute - [0,59] */ 4 int tm_

Java 日期时间 Date类型,long类型,String类型表现形式的转换 (转)

Java 日期时间 Date类型,long类型,String类型表现形式的转换 1.java.util.Date类型转换成long类型java.util.Date dt = new Date();System.out.println(dt.toString());   //java.util.Date的含义long lSysTime1 = dt.getTime() / 1000;   //得到秒数,Date类型的getTime()返回毫秒数 2.由long类型转换成Date类型SimpleDat