2015-11-30 47 views
9

我有一個正在運行的應用程序春季啓動1.3 +休眠5 + Java 8 + ZonedDateTime + postgresql和其中一個表我有以下字段。hibernate 5 + ZonedDateTime + postgresql inlcude時區和偏移量

@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 | 

我知道,如果我「WITH TIME ZONE TIMESTAMP」添加columnDefinition =到列即像

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

那麼它正常工作,我能夠看到休眠創造了時區的一列,但如果我理解正確這這將是唯一的工作postgre即,如果我明天將數據庫更改爲mysql,那麼hibernate會拋出一個錯誤。

因此,我的問題是如何做到這一點,即通知hibernate創建一個應包含時區和偏移量的列。我認爲,由於Java類型的「ZonedDateTime」被創建爲包含UTC中的時區和時間偏移量,因此休眠將默認創建一個包含時區的列。因此,再次提出問題是什麼才能讓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"); 
     } 
     }; 
    } 

回答

2

看來這個問題只有一個障礙,如果你使用Hibernate的模式創建。因此,如果在PostgreSQL上創建了timestamp with time zone這一列之後,一切正常,那就去吧。無論如何,讓Hibernate生成你的模式是一個不好的做法。手動操作(或者讓DBA這樣做)。如果您想自動化,請在可靠人員編寫sql腳本後使用數據庫遷移工具,如FlywayLiquibase。除此之外,「明天更改數據庫」的要求聽起來真是虛構,獨立工作的數據庫或多或少是不現實的,在編寫需要執行的更大的應用程序時變得更加困難。

如果您需要更多關於Hibernate/JDBC時間戳行爲的信息,可以查看this nice article about that