2015-11-30 29 views
9

Ho un'app di avvio della molla in esecuzione 1.3 + hibernate 5 + java 8 + ZonedDateTime + postgresql e in una delle tabelle ho i seguenti campi.hibernate 5 + ZonedDateTime + postgresql inlcude fuso orario e lo scostamento

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

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

Se faccio funzionare l'applicazione poi vedo che questo di default produce "timestamp senza fuso orario"

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 | 

so che se aggiungo il ColumnDefinition = "TIMESTAMP WITH TIME ZONE" al colonna vale a dire qualcosa come

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

allora funziona correttamente e sono in grado di vedere che Hibernate ha creato una colonna con il fuso orario, ma se ho capito bene questo sarà solo lavorare per Postgre s se io cambio il database domani a mysql allora l'ibernazione genera un errore.

Quindi la mia domanda è come fare, in generale, vale a dire per raccontare ibernazione per creare una colonna che dovrebbe includere il fuso orario e l'offset. Ero del parere che in quanto il tipo java "ZonedDateTime" viene deliberetelly creata per includere il fuso orario e la differenza di fuso orario in UTC poi Hibernate per default creare una colonna che includono il fuso orario. Quindi la domanda di nuovo qual è il modo corretto di dire in ibernazione per includere il fuso orario e l'offset.

qui sono parti del mio 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> 

e le mie proprietà dei file che mostra il dialetto

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

risposta

2

Sembra che questo problema è solo un ostacolo se si utilizza Hibernate per la creazione dello schema. Quindi, se tutto funziona bene dopo aver creato la colonna come timestamp with time zone su PostgreSQL, basta andare con quello. In ogni caso è una cattiva pratica lasciare che Hibernate generi il tuo schema. Fatelo manualmente (o lasciate che sia un DBA a farlo). Se si desidera automatizzare, utilizzare uno strumento di migrazione di database come Flyway o Liquibase dopo che una persona affidabile ha scritto gli script SQL.

Oltre a questo, il requisito "modifica il database di domani" sembra davvero fittizio, il database di lavoro indipendente è più o meno irrealistico e diventa più difficile scrivere applicazioni più grandi che devono essere eseguite.

Se sono necessarie ulteriori informazioni sul comportamento di data/ora di Hibernate/JDBC, è possibile controllare this nice article about that.