sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Clase de modelo JPA para el campo TIMESTAMP SIN ZONA HORARIA DEFAULT CURRENT_TIMESTAMP en Postgres?

Tipo incorrecto

LocalDateTime es el tipo incorrecto aquí. Esa clase no puede representar un momento, como se explica en su Javadoc.

Esa clase deliberadamente no tiene concepto de zona horaria o desplazamiento desde UTC. Entonces representa una fecha y una hora del día como “el mediodía del 23 de enero de 2019”, pero no sé si eso es mediodía en Tokio, París o Montreal, por ejemplo, tres momentos muy diferentes que son varias horas de diferencia. Por lo tanto, este tipo es apropiado para el tipo de SQL estándar TIMESTAMP WITHOUT TIME ZONEsin , no con .

Para obtener más información, consulte:¿Cuál es la diferencia entre Instant y LocalDateTime?

Tipo correcto

Para SQL estándar, escriba TIMESTAMP WITH TIME ZONE , debería usar los tipos de Java Instant , OffsetDateTime o ZonedDateTime . De esos tres, JDBC 4.2 requiere soporte solo para el segundo, OffsetDateTime .

Recuperación.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

El valor recuperado de Postgres siempre estará en UTC. El estándar SQL no especifica este comportamiento, por lo que las bases de datos varían. En Postgres, cualquier valor enviado a un campo de tipo TIMESTAMP WITH TIME ZONE se ajusta a UTC. Los valores recuperados están en UTC.

almacenar

myPreparedStatement.setObject( … , odt ) ;

Ajuste desde UTC (compensación de cero) a la hora del reloj de pared utilizada por las personas de una región en particular (una zona horaria).

ZoneId z = ZoneId.of( "Asia/Tokyo" ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

JPA

No uso JPA, prefiero mantener las cosas simples.

Pero según esta respuesta , JPA 2.2 admite java.time tipos.

Hibernate también es compatible con java.time .