13

実行中のアプリ spring boot 1.3 + hibernate 5 + Java 8 + ZonedDateTime + postgresql があり、テーブルの 1 つに次のフィールドがあります。

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

その後、正しく動作し、休止状態がタイムゾーンで列を作成したことを確認できますが、これを正しく理解していれば、これは postgres でのみ機能します。つまり、明日データベースを mysql に変更すると、休止状態はエラーをスローします。

したがって、私の質問は、一般的にそれを行う方法です。つまり、タイムゾーンとオフセットを含める必要がある列を作成するように休止状態に指示することです。Javaタイプの「ZonedDateTime」はタイムゾーンとUTCの時間オフセットを含むように意図的に作成されているため、休止状態はデフォルトでタイムゾーンを含む列を作成するという意見でした。したがって、もう一度質問します。休止状態にタイムゾーンとオフセットを含めるように指示する適切な方法は何ですか。

これが私の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");
         }
      };
   }
4

1 に答える 1

7

スキーマの作成に Hibernate を使用する場合、この問題は障害にすぎないようです。timestamp with time zoneしたがって、PostgreSQL でのように列を作成した後、すべてがうまく機能する場合は、そのまま使用してください。とにかく、Hibernate にスキーマを生成させるのは悪い習慣です。手動で行います (または DBA に任せます)。自動化したい場合は、信頼できる人が sql スクリプトを作成した後、FlywayLiquibaseなどのデータベース移行ツールを使用してください。

これに加えて、「明日データベースを変更する」という要件は本当に架空のように聞こえます。データベースに依存せずに動作することは、多かれ少なかれ非現実的であり、実行する必要があるより大きなアプリケーションを作成するのが難しくなります。

Hibernate / JDBC タイムスタンプの動作に関する詳細情報が必要な場合は、この素晴らしい記事をチェックしてください。

于 2017-06-11T15:07:50.790 に答える