hibernate 5 + ZonedDateTime + postgresql包括时区和偏移量

问题描述 投票:11回答:1

我有一个正在运行的应用程序spring boot 1.3 + hibernate 5 + java 8 + ZonedDateTime + postgresql并且在其中一个表中我有以下字段。

@Column(name = "DATE_ENABLED")
@Type(type="java.time.ZonedDateTime")   
private ZonedDateTime dateEnabled;

@Column(name = "DATE_DISABLED")
@Type(type="java.time.ZonedDateTime")   
private ZonedDateTime dateDisabled;

如果我运行该应用程序,那么我发现默认情况下会生成“没有时区的时间戳”

testDB=# \d type
                Table "public.type"
             Column             |            Type             | Modifiers 
--------------------------------+-----------------------------+-----------
 type_id                        | bytea                       | not null
 date_disabled                  | timestamp without time zone | 
 date_enabled                   | timestamp without time zone | 

我知道如果我将columnDefinition =“TIMESTAMP WITH TIME ZONE”添加到列中,例如

@Column(name = "DATE_DISABLED", columnDefinition= "TIMESTAMP WITH TIME ZONE")

然后它正常工作,我能够看到hibernate创建了一个带有时区的列,但如果我理解正确,这将只适用于postgres,即如果我明天将数据库更改为mysql,那么hibernate将抛出错误。

因此,我的问题是如何一般地这样做,即告诉hibernate创建一个应该包括时区和偏移的列。我认为,由于故意创建java类型“​​ZonedDateTime”以包括时区和UTC时间偏移,因此hibernate默认会创建一个包含时区的列。因此问题再次出现:告诉hibernate包含时区和偏移的正确方法是什么。

这是我的pom的一部分:

    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RELEASE</version>

    <hibernate.version>5.0.4.Final</hibernate.version>

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-java8</artifactId>
        <version>${hibernate.version}</version>
    </dependency>

和我的属性文件显示方言

    @Bean
    public  Properties hibernateProperties() {
      return new Properties() {
        {
            setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
            setProperty("hibernate.chach.provider_class", "org.hibernate.cache.NoCacheProvider");
            setProperty("hibernate.show_sql", "true");              
            setProperty("hibernate.hbm2ddl.auto", "create-drop");
         }
      };
   }
hibernate postgresql java-8 hibernate-5.x
1个回答
4
投票

如果你使用Hibernate进行模式创建,这个问题似乎只是一个障碍。因此,如果在PostgreSQL上将列创建为timestamp with time zone之后一切运行良好,那就去吧。无论如何,让Hibernate生成你的架构是一个坏习惯。手动执行(或让DBA执行此操作)。如果要自动化,请在可靠的人编写sql脚本后使用FlywayLiquibase等数据库迁移工具。

除此之外,“明天改变数据库”的要求听起来确实是虚构的,独立于数据库工作或多或少是不现实的,并且在编写必须执行的更大应用程序时变得更加困难。

如果您需要有关Hibernate / JDBC时间戳行为的更多信息,可以查看this nice article about that

© www.soinside.com 2019 - 2024. All rights reserved.