• 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" ) );

  • 相关阅读:
    ABP AsyncHelper.RunSync 内部实现
    ABP 扩展 OrganizationUnit 数据实体(新增字段)
    ABP 调用 PUT 接口报错 405 Method Not Allowed
    ABP 扩展 Role 数据实体(新增字段)
    C# EntityFramework 自定义数据库表名(一)
    EPPlus.Core(OfficeOpenXml) 获取 Excel 数据集合
    C# 获取文件并将文件按创建/修改时间排序
    C# 计算两个日期之间的月份数(差值)
    C# Split 方法扩展支持双引号
    教你在 C# 代码中写出带高亮关键字的注释
  • 原文地址:https://www.cnblogs.com/wuwuyong/p/15250811.html
Copyright © 2020-2023  润新知