PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come mappare il timestamp postgresql con il fuso orario in un'entità JPA 2

Alla fine ho fatto questo "lavoro" - in un modo hackish - disattivando la convalida dello schema.

In precedenza, avevo <property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto" nel mio persistence.xml. Quando ho commentato questa proprietà, il mio server dell'app è stato avviato e il modello "ha funzionato".

La forma finale della mia entità era:

@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 */

Dopo aver letto un po' su questo, ho avuto l'impressione che non ci sia un modo semplice per mappare il timestamp di Postgresql con le colonne del fuso orario.

Alcune combinazioni di implementazione JPA + database lo supportano in modo nativo (EclipseLink + Oracle è un esempio). Per l'ibernazione, con le estensioni jodatime, è possibile memorizzare timestamp consapevoli del fuso orario utilizzando un timestamp normale + un campo varchar per il fuso orario (non potevo farlo poiché ero costretto a modificare lo schema del database). Tipi di utenti Jadira o tipi di utenti completamente personalizzati possono essere utilizzati anche per affrontare questo problema.

Devo notare che il mio caso d'uso per questa entità è "sola lettura", quindi potrei cavarmela con una "soluzione" apparentemente ingenua.