PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Classe de modelo JPA para o campo TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP no Postgres?



Tipo errado


LocalDateTime é o tipo errado aqui. Essa classe não pode representar um momento, conforme explicado em seu Javadoc.

Essa classe propositalmente não tem conceito de fuso horário ou deslocamento do UTC. Portanto, representa uma data e uma hora do dia como “meio-dia de 23 de janeiro de 2019”, mas não sei se é meio-dia em Tóquio, Paris ou Montreal, por exemplo, três momentos muito diferentes que são várias horas de intervalo. Portanto, este tipo é apropriado para o tipo SQL padrão TIMESTAMP WITHOUT TIME ZONEsem , não com .

Para mais discussões, consulte:Qual ​​é a diferença entre Instant e LocalDateTime?

Tipo certo


Para o tipo SQL padrão TIMESTAMP WITH TIME ZONE , você deve usar os tipos Java Instant , OffsetDateTime , ou ZonedDateTime . Desses três, o JDBC 4.2 requer suporte apenas para o segundo, OffsetDateTime .

Recuperação.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

O valor recuperado do Postgres sempre estará em UTC. O padrão SQL não especifica esse comportamento, portanto, os bancos de dados variam. No Postgres qualquer valor enviado para um campo do tipo TIMESTAMP WITH TIME ZONE é ajustado para UTC. Os valores recuperados estão em UTC.

Armazenamento.
myPreparedStatement.setObject( … , odt ) ;

Ajuste de UTC (deslocamento de zero) para a hora do relógio de parede usada pelas pessoas de uma determinada região (um fuso horário).
ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

JPA


Eu não uso JPA, preferindo manter as coisas simples.

Mas de acordo com esta resposta , JPA 2.2 suporta o java.time tipos.

O Hibernate também suporta java.time .