hibernar 5 + ZonedDateTime + postgresql inlcude fuso horário e o deslocamento

9

Eu tenho um aplicativo em execução inicialização de mola 1.3 + hibernate 5 + java 8 + ZonedDateTime + postgresql e em uma das tabelas eu tenho os seguintes campos.

@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 eu executar o aplicativo, vejo que isso, por padrão, produz "timestamp sem fuso horário"

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 | 

Se eu adicionar o columnDefinition="TIMESTAMP WITH TIME ZONE" à coluna, por exemplo,

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

então funciona corretamente e eu sou capaz de ver que o hibernate criou uma coluna com fuso horário, mas se eu entendi isso corretamente isso só funcionará para postgres ou seja, se eu mudar o banco de dados amanhã para mysql então o hibernate irá lançar um erro .

Assim, minha pergunta é como fazer isso em geral, ou seja, dizer ao hibernate para criar uma coluna que deve incluir o fuso horário e o deslocamento. Eu era a opinião que desde que o tipo de java "ZonedDateTime" é deliberadamente criado para incluir o fuso horário e o deslocamento de tempo em UTC, então o hibernate por padrão criará uma coluna que inclua o fuso horário. Assim, a pergunta novamente qual é a maneira correta de dizer ao hibernate para incluir o fuso horário e o offset.

aqui são partes do meu 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 meu arquivo de propriedades mostrando o dialeto

    @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");
         }
      };
   }
    
por Tito 30.11.2015 в 23:06
fonte

1 resposta

2

Parece que este problema é apenas um obstáculo se você usar o Hibernate para criação de esquemas. Então, se tudo funcionar bem depois que você criou a coluna como timestamp with time zone no PostgreSQL, basta ir com isso. De qualquer forma, é uma prática ruim deixar o Hibernate gerar seu esquema. Faça isso manualmente (ou deixe um DBA fazer isso). Se você deseja automatizar, use uma ferramenta de migração de banco de dados como Flyway ou Liquibase depois que uma pessoa confiável escreveu os scripts sql.

Além disso, o requisito "alterar o banco de dados amanhã" soa realmente fictício, o trabalho independente de banco de dados é mais ou menos irreal e fica mais difícil para escrever aplicativos maiores que precisam ser executados.

Se você precisar de mais informações sobre o comportamento do timestamp do Hibernate / JDBC, talvez dê uma olhada em este belo artigo sobre isso .

    
por Kevin Peters 11.06.2017 / 17:07
fonte