zoukankan      html  css  js  c++  java
  • 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" ) );

  • 相关阅读:
    写一个webpack plugin
    element的隐藏组件滚动条el-scrollbar使用
    iview 父组件动态传值给子组件
    RabbitMQ + Springboot +“Hello Word”
    Exception in thread "main" SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: ElasticsearchParseException[malformed, expected end of settings but encountered additional conte
    java.nio.file.NoSuchFileException
    A.CTable 自动创建数据表
    mybatis 动态添加表,查看表,添加数据
    异常:Error resolving template "xxx", template might not exist or might not be accessible...解决办法
    Springboot项目启动后访问不到Controller
  • 原文地址:https://www.cnblogs.com/wuwuyong/p/15250811.html
Copyright © 2011-2022 走看看