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

Cómo mapear la marca de tiempo postgresql con la zona horaria en una entidad JPA 2

Eventualmente hice que esto "funcionara", de una manera un poco cortante, desactivando la validación del esquema.

Anteriormente, tenía <property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto" en mi persistencia.xml. Cuando comenté esta propiedad, mi servidor de aplicaciones se inició y el modelo "funcionó".

La forma final de mi entidad fue:

@Entity
@Table(schema = "content", name = "theme")
public class Theme extends AbstractBaseEntity {
    private static final long serialVersionUID = 1L;

    @Column(name = "run_from", columnDefinition = "timestamp with time zone not null")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runFrom;

    @Column(name = "run_to", columnDefinition = "timestampt with time zone not null")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runTo;

    /* Getters, setters, .hashCode(), .equals() etc omitted */

Después de leer un poco sobre esto, tengo la impresión de que no hay una manera fácil de mapear la marca de tiempo de Postgresql con las columnas de zona horaria.

Algunas combinaciones de base de datos + implementación de JPA admiten esto de forma nativa (EclipseLink + Oracle es un ejemplo). Para hibernate, con extensiones jodatime, es posible almacenar marcas de tiempo conscientes de la zona horaria usando una marca de tiempo normal + un campo varchar para la zona horaria (no pude hacerlo porque no podía cambiar el esquema de la base de datos). Tipos de usuarios de Jadira o también se pueden usar tipos de usuario completamente personalizados para abordar este problema.

Debo tener en cuenta que mi caso de uso para esta entidad es "solo lectura", por lo que podría salirme con la mía con una "solución" aparentemente ingenua.