配色: 字号:
日期时间JPA映射
2016-09-10 | 阅:  转:  |  分享 
  
日期时间JPA映射

数据库日期时间类型

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

Date类型

数据库表

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

[java]viewplaincopy

CREATETABLE`Student`(

`StudentId`bigintunsignedNOTNULLPRIMARYKEYAUTO_INCREMENT,

`Name`varchar(100)NOTNULL,

`CreateTime`dateNOTNULL,

PRIMARYKEY(`StudentId`),

KEY`StudentName`(`Name`)

)ENGINE=InnoDB;

实体类

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

[java]viewplaincopy

packagecom.gxz.entities;



importjava.sql.Date;



importjavax.persistence.Column;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.GenerationType;

importjavax.persistence.Id;

importjavax.persistence.Table;



@Entity

@Table

publicclassStudent{

privatelongid;

privateStringname;

privateDatecreateTime;



@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="StudentId")

publiclonggetId(){

returnid;

}



publicvoidsetId(longid){

this.id=id;

}



publicStringgetName(){

returnname;

}



publicvoidsetName(Stringname){

this.name=name;

}



publicDategetCreateTime(){

returncreateTime;

}



publicvoidsetCreateTime(DatecreateTime){

this.createTime=createTime;

}



}

持久化

[java]viewplaincopy

Studentstudent=newStudent();

student.setName("张三");

student.setCreateTime(newDate(newSimpleDateFormat("yyyy-MM-dd").parse("2016-01-01").getTime()));



manager.persist(student);

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



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

[java]viewplaincopy

Studentstudent=newStudent();

student.setName("张三");

student.setCreateTime(newDate(newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").parse("2016-01-0101:01:01").getTime()));



manager.persist(student);

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



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

[sql]viewplaincopy

CREATETABLE`Student`(

`StudentId`bigintunsignedNOTNULLPRIMARYKEYAUTO_INCREMENT,

`Name`varchar(100)NOTNULL,

`CreateTime`datetimeNOTNULL,

KEY`StudentName`(`Name`)

)ENGINE=InnoDB;

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

[java]viewplaincopy

student.setCreateTime(newDate(newSimpleDateFormat("yyyy-MM-dd").parse("2016-01-01").getTime()));

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



[java]viewplaincopy

student.setCreateTime(newDate(newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").parse("2016-01-0101:01:01").getTime()));





DateTime类型

数据库表

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

实体类

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

[java]viewplaincopy

packagecom.gxz.entities;



importjava.sql.Timestamp;



importjavax.persistence.Column;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.GenerationType;

importjavax.persistence.Id;

importjavax.persistence.Table;



@Entity

@Table

publicclassStudent{

privatelongid;

privateStringname;

privateTimestampcreateTime;



@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="StudentId")

publiclonggetId(){

returnid;

}



publicvoidsetId(longid){

this.id=id;

}



publicStringgetName(){

returnname;

}



publicvoidsetName(Stringname){

this.name=name;

}



publicTimestampgetCreateTime(){

returncreateTime;

}



publicvoidsetCreateTime(TimestampcreateTime){

this.createTime=createTime;

}

}

持久化

[java]viewplaincopy

Studentstudent=newStudent();

student.setName("张三");

student.setCreateTime(newTimestamp(newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").parse("2016-01-0202:01:01").getTime()));



manager.persist(student);

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



Time类型

数据库表

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

[sql]viewplaincopy

CREATETABLE`Student`(

`StudentId`bigintunsignedNOTNULLPRIMARYKEYAUTO_INCREMENT,

`Name`varchar(100)NOTNULL,

`CreateTime`timeNOTNULL,

KEY`StudentName`(`Name`)

)ENGINE=InnoDB;

实体类

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

[java]viewplaincopy

packagecom.gxz.entities;



importjava.sql.Time;



importjavax.persistence.Column;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.GenerationType;

importjavax.persistence.Id;

importjavax.persistence.Table;



@Entity

@Table

publicclassStudent{

privatelongid;

privateStringname;

privateTimecreateTime;



@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="StudentId")

publiclonggetId(){

returnid;

}



publicvoidsetId(longid){

this.id=id;

}



publicStringgetName(){

returnname;

}



publicvoidsetName(Stringname){

this.name=name;

}



publicTimegetCreateTime(){

returncreateTime;

}



publicvoidsetCreateTime(TimecreateTime){

this.createTime=createTime;

}

}

持久化

[java]viewplaincopy

Studentstudent=newStudent();

student.setName("张三");

student.setCreateTime(newTime(newSimpleDateFormat("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。

[java]viewplaincopy

packagecom.gxz.entities;



importjava.util.Calendar;



importjavax.persistence.Column;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.GenerationType;

importjavax.persistence.Id;

importjavax.persistence.Table;

importjavax.persistence.Temporal;

importjavax.persistence.TemporalType;



@Entity

@Table

publicclassStudent{

privatelongid;

privateStringname;

privateCalendarcreateTime;



@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="StudentId")

publiclonggetId(){

returnid;

}



publicvoidsetId(longid){

this.id=id;

}



publicStringgetName(){

returnname;

}



publicvoidsetName(Stringname){

this.name=name;

}



@Temporal(TemporalType.TIMESTAMP)

publicCalendargetCreateTime(){

returncreateTime;

}



publicvoidsetCreateTime(CalendarcreateTime){

this.createTime=createTime;

}





}

持久化(Calendar类型)

[java]viewplaincopy

Studentstudent=newStudent();

student.setName("张三");

Calendarcalendar=Calendar.getInstance();

calendar.setTime(newSiwww.shanxiwang.netmpleDateFormat("yyyy-MM-ddHH:mm:ss").parse("2016-05-1212:25:23"));

student.setCreateTime(calendar);

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



数据库表(Date类型)

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

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

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

[java]viewplaincopy

packagecom.gxz.entities;



importjava.util.Date;



importjavax.persistence.Column;

importjavax.persistence.Entity;

importjavax.persistence.GeneratedValue;

importjavax.persistence.GenerationType;

importjavax.persistence.Id;

importjavax.persistence.Table;

importjavax.persistence.Temporal;

importjavax.persistence.TemporalType;



@Entity

@Table

publicclassStudent{

privatelongid;

privateStringname;

privateDatecreateTime;



@Temporal(TemporalType.DATE)

publicDategetCreateTime(){

returncreateTime;

}



publicvoidsetCreateTime(DatecreateTime){

this.createTime=createTime;

}



@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="StudentId")

publiclonggetId(){

returnid;

}



publicvoidsetId(longid){

this.id=id;

}



publicStringgetName(){

returnname;

}



publicvoidsetName(Stringname){

this.name=name;

}

}

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

[java]viewplaincopy

Studentstudent=newStudent();

student.setName("张三");

student.setCreateTime(newSimpleDateFormat("yyyy-MM-dd").parse("2016-05-13"));



manager.persist(student);

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



献花(0)
+1
(本文系网络学习天...首藏)