2012-11-13 13 views
21

Ich habe eine JPA 2-Anwendung (mit Hibernate 3.6 als JPA-Implementierung), die Postgresql verwendet (mit dem JDBC-Treiber 9.0-801.jdbc3).So ordnen Sie postgresql "Zeitstempel mit Zeitzone" in einer JPA 2-Entität an

Ich habe Probleme beim Zuordnen von "Zeitstempel mit Zeitzone" -Feldern in meine JPA-Entitäten. Hier

ein Beispiel:

CREATE TABLE theme 
(
    id serial NOT NULL, 
    # Fields that are not material to the question have been edited out 
    run_from timestamp with time zone NOT NULL, 
    run_to timestamp with time zone NOT NULL, 
    CONSTRAINT theme_pkey PRIMARY KEY (id), 
    CONSTRAINT theme_name_key UNIQUE (name) 
) 

ich versucht habe, zu kartieren wie folgt:

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

    @Column(name = "run_from") 
    @NotNull 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date runFrom; 

    @Column(name = "run_to") 
    @NotNull 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date runTo; 

    /* The rest of the entity has been edited out */ 

Ich erhalte immer eine Ausnahme mit der folgenden Ursache: Caused by: org.hibernate.HibernateException: Wrong column type in public.backend_themetopic for column created. Found: timestamptz, expected: date

Was Ich habe versucht

  • java.util.Calendar mit java.util.Date ersetzen - machten keinen Unterschied
  • mit java.sql.Timestamp - darüber beschwert, dass ich die @Temporal Anmerkung in ein
  • Timestamp nicht anwenden kann org.joda.time.DateTime mit einer benutzerdefinierten @Type Annotation (@Type(type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ")) mit auch nicht funktionierte

Einschränkungen

  • Diese Anwendung mit einem „Altsystem“ interagiert - so ist die Art der Datumsfelder ändern, nicht eine gute Option

Meine Frage ist: Wie soll ich diese Zeitzone bewusst Zeitstempel in meine JPA-Entitäten abzubilden?

Antwort

6

Ich machte schließlich diese "Arbeit" - auf eine hashische Weise - durch Ausschalten der Schema-Validierung.

Zuvor hatte ich <property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto" in meiner persistence.xml. Als ich diese Eigenschaft auskommentierte, startete mein App-Server und das Modell "arbeitete".

Die endgültige Form meiner Einheit war:

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

Nachdem auf diese ziemlich viel zu lesen, ich habe den Eindruck, dass es keine einfache Möglichkeit ist Postgresql Zeitstempel mit Zeitzone Spalten abzubilden.

Einige JPA-Implementierung + Datenbank-Kombinationen unterstützen dies nativ (EclipseLink + Oracle ist ein Beispiel). Für Hibernate, mit jodatime-Erweiterungen, ist es möglich, zeitzonenbewusste Zeitstempel mit einem normalen Zeitstempel + einem varchar-Feld für die Zeitzone zu speichern (das konnte ich nicht, da ich das Datenbankschema nicht ändern konnte). Jadira user types oder vollständig benutzerdefinierte Benutzertypen können ebenfalls verwendet werden, um dieses Problem anzugehen.

Ich muss beachten, dass mein Anwendungsfall für diese Entität "schreibgeschützt" ist, so dass ich mit einer scheinbar naiven "Lösung" davonkommen könnte.

5

hinzufügen @Column(columnDefinition= "TIMESTAMP WITH TIME ZONE")

@Column(name = "run_from", columnDefinition= "TIMESTAMP WITH TIME ZONE") 
@NotNull 
@Temporal(TemporalType.TIMESTAMP) 
private Date runFrom; 
+0

Ist das nur wirklich nützlich für das DDL Auto oder während der Laufzeit auch? – cslotty

+0

'columnDefinition'-Wert wird nur in DDL verwendet. Wenn Ihre Tabellenspalte jedoch mit dieser DDL erstellt wurde, wirkt sich dies indirekt auch auf das Laufzeitverhalten aus. –

Verwandte Themen