How to map postgresql “timestamp with time zone” in a JPA 2 entity

前端 未结 2 1103
情深已故
情深已故 2020-12-29 20:32

I have a JPA 2 application ( with Hibernate 3.6 as the JPA implementation ) that uses Postgresql ( with the 9.0-801.jdbc3 JDBC driver ).

I am having trouble mapping

相关标签:
2条回答
  • 2020-12-29 20:55

    I eventually made this "work" - in a hackish sort of way - by turning off schema validation.

    Previously, I had <property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto" in my persistence.xml. When I commented out this property, my app server started and the model "worked".

    The final form of my entity was:

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

    After reading quite a bit on this, I got the impression is that there is no easy way to map Postgresql timestamp with time zone columns.

    Some JPA implementation + database combinations support this natively ( EclipseLink + Oracle is one example ). For hibernate, with jodatime extensions, it is possible to store timezone aware timestamps using a normal timestamp + a varchar field for the timezone( I could not do that since I was constrained from changing the database schema ). Jadira user types or completely custom user types can also be used to tackle this problem.

    I need to note that my use-case for this entity is "read only", so I could get away with a seemingly naive "solution".

    0 讨论(0)
  • 2020-12-29 20:58

    Add @Column(columnDefinition= "TIMESTAMP WITH TIME ZONE")

    @Column(name = "run_from", columnDefinition= "TIMESTAMP WITH TIME ZONE")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runFrom;
    
    0 讨论(0)
提交回复
热议问题