2015-11-30 53 views
9

をinlcude。Hibernateは5 + ZonedDateTime + PostgreSQLは時間帯と私は実行中のアプリの春ブーツ1.3 + 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 =「TIME ZONE WITH TIMESTAMP」を追加した場合ことを知っていますコラムすなわち

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

のようなもの、それが正常に動作し、私はそのHibernateはタイムゾーンの列を作成したが、私はこのことを理解している場合、正しくこれが唯一postgreのために働くことになります見ることができていますつまり、明日mysqlにデータベースを変更すると、休止状態になってエラーがスローされます。

私の質問は、これを行う方法です。つまり、タイムゾーンとオフセットを含む列を作成するようにhibernateに指示することです。私は、Javaタイプ "ZonedDateTime"はdeliberetellyでタイムゾーンとUTCでの時間オフセットを含むように作成されているため、休止状態はデフォルトでタイムゾーンを含む列を作成するという意見でした。したがって、タイムゾーンとオフセットを含むように休止状態を伝える正しい方法は何ですか?

は、ここに私のポンポン

<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スクリプトを作成した後に、FlywayまたはLiquibaseのようなデータベース移行ツールを使用します。このほかに

、要件「明日のデータベースを変更するには、」本当に架空のサウンド、データベースの独立した作業は、多かれ少なかれ、非現実的であると実行する必要が大きなアプリケーションを書くことに難しくなります。

あなたは多分this nice article about thatをチェックアウトは、Hibernate/JDBCタイムスタンプの動作に関する詳細情報が必要な場合。

関連する問題