返回顶部

Hibernate详解一(领域模型)

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.LocalTimejava.time.OffsetTime

TIMESTAMP:java.time.Instantjava.time.LocalDateTimejava.time.OffsetDateTime 和 java.time.ZonedDateTime

因为 Java 8 日期/时间类和 SQL 类型之间的映射是隐式的,所以不需要指定 @Temporal 注释。否则会报异常。

使用特定时区:

当未指定时区时,JDBC 驱动程序将使用底层 JVM 默认时区,如果应用程序在全球范围内使用,这可能不合适。因此,每当从数据库保存/加载数据时,使用单一参考时区(例如 UTC)是很常见的。

一种替代方法是将所有 JVM 配置为使用参考时区:

声明式:java -Duser.timezone=UTC ...

编程方式:TimeZone.setDefault( TimeZone.getTimeZone( "UTC" ) );

 

posted @ 2021-09-18 13:53  不懒人  阅读(100)  评论(0编辑  收藏  举报