1.简单类型
1.1 简单类型
1.1.1 映射Date/Time值
SQL 标准定义了三种日期/时间类型:DATE、TIME、TIMESTAMP,分别对应Java中的java.sql.Date、java.sql.Time和java.sql.Timestamp。
为了避免对 java.sql 包的依赖,通常使用 java.util 或 java.time Date/Time 类而不是 java.sql.Timestamp 和 java.sql.Time 类。
虽然 java.sql 类定义了与 SQL 日期/时间数据类型的直接关联,但 java.util 或 java.time 属性需要使用 @Temporal 注释显式标记 SQL 类型关联。这样,java.util.Date 或 java.util.Calendar 可以映射到 SQL DATE、TIME 或 TIMESTAMP 类型。
(1)使用java.util.Date映射DATE
import javax.persistence.*; import java.util.Date; /** * @Author: wwy * @Date: 2021/9/10 9:54 */ @Entity(name = "DateEvent") public class DateEvent { @Id @GeneratedValue private Long id; @Column(name = "`timestamp`") @Temporal(TemporalType.DATE) private Date timestamp; //Getters and setters are omitted for brevity }
当执行持久化操作时:
DateEvent dateEvent = new DateEvent( new Date() ); entityManager.persist( dateEvent );
Hibernate 生成以下 INSERT 语句:
INSERT INTO DateEvent ( timestamp, id ) VALUES ( '2015-12-29', 1 )
如果我们将@Temporal 类型更改为 TIME:
@Column(name = "`timestamp`") @Temporal(TemporalType.TIME) private Date timestamp;
Hibernate 将发出一个包含小时、分钟和秒的 INSERT 语句:
INSERT INTO DateEvent ( timestamp, id ) VALUES ( '16:51:58', 1 )
当@Temporal 类型设置为 TIMESTAMP 时:
@Column(name = "`timestamp`") @Temporal(TemporalType.TIMESTAMP) private Date timestamp;
Hibernate 将在 INSERT 语句中包含 DATE、TIME 和纳秒:
INSERT INTO DateEvent ( timestamp, id ) VALUES ( '2015-12-29 16:54:04.544', 1 )
1.1.2 映射 Java 8 Date/Time值
标准 SQL 日期/时间类型与受支持的 Java 8 日期/时间类类型之间的映射如下所示:
DATE:java.time.LocalDate
TIME:java.time.LocalTime
, java.time.OffsetTime
TIMESTAMP:java.time.Instant
, java.time.LocalDateTime
, java.time.OffsetDateTime
和 java.time.ZonedDateTime
因为 Java 8 日期/时间类和 SQL 类型之间的映射是隐式的,所以不需要指定 @Temporal 注释。否则会报异常。
使用特定时区:
当未指定时区时,JDBC 驱动程序将使用底层 JVM 默认时区,如果应用程序在全球范围内使用,这可能不合适。因此,每当从数据库保存/加载数据时,使用单一参考时区(例如 UTC)是很常见的。
一种替代方法是将所有 JVM 配置为使用参考时区:
声明式:java -Duser.timezone=UTC ...
编程方式:TimeZone.setDefault( TimeZone.getTimeZone( "UTC" ) );