Frage

Ich erlebe das folgende sehr ärgerlich Verhalten beim PPV Entitys in Verbindung mit Oracle 10g verwenden.

Angenommen, Sie die folgende Einheit haben.

@Entity
@Table(name = "T_Order")
public class TOrder implements Serializable {
    private static final long serialVersionUID = 2235742302377173533L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "activationDate")
    private Calendar activationDate;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Calendar getActivationDate() {
        return activationDate;
    }

    public void setActivationDate(Calendar activationDate) {
        this.activationDate = activationDate;
    }
}

Diese Einheit auf Oracle 10g abgebildet, so in der DB gibt es eine Tabelle T_ORDER mit einer Primärschlüssel NUMBER Spalte „ID“ und einer TIMESTAMP-Spalte „activationDate“ sein.

Lets nehme ich eine Instanz dieser Klasse mit dem Aktivierungsdatum „15. September 2008 00.00 Uhr“ erstellen. Meine lokale Zeitzone CEST das ist GMT + 02: 00. Als ich dieses Objekt bestehen bleiben und die Daten aus der Tabelle T_ORDER wählte sqlplus verwenden, finde ich heraus, dass in der Tabelle tatsächlich „14. September 2008 22.00 Uhr“ gespeichert, die so weit in Ordnung, weil die Orakel db Zeitzone GMT ist.

Aber jetzt das lästige Teil. Als ich diese Einheit wieder in meine JAVA-Programm zu lesen, finde ich, dass die Oracle-Zeitzone aus ignoriert und ich „14. September 2008 22.00 Uhr CEST“, die definitiv falsch ist.

Also im Grunde, wenn sie auf die DB die Zeitzone Schreiben verwendet werden, beim Lesen wird er ignoriert.

Gibt es eine Lösung für dieses da draußen? Die einfachste Lösung, die ich denke, das Orakel dbs Zeitzone GMT + 02 zu setzen, wäre aber leider kann ich das nicht tun, weil es andere Anwendungen den gleichen Server.

Wir verwenden die folgende Technologie

MyEclipse 6.5 JPA mit Hibernate 3.2 Oracle 10g Thin JDBC-Treiber

War es hilfreich?

Lösung

Sie sollten nicht einen Kalender für den Zugriff auf Termine aus der Datenbank für diesen genauen Grund verwenden. Sie sollten java.util.Date wie so verwenden:

@Temporal(TemporalType.TIMESTAMP)
@Column(name="activationDate")
public Date getActivationDate() {
    return this.activationDate;
}

java.util.Date Punkte zu einem Zeitpunkt, unabhängig von irgendwelchen Zeitzonen. Kalender verwendet werden kann, ein Datum für eine bestimmte Zeitzone oder locale zu formatieren.

Andere Tipps

Ich hatte schon meinen Anteil an Problemen mit JPA und Zeitstempel. Ich habe in der gelesen Orakel Foren und überprüfen Sie bitte die folgenden :

  • Das Feld in der Datenbank sollte TIMESTAMP_TZ sein und nicht nur TIMESTAMP
  • Versuchen Sie, die Anmerkung @Temporal (Wert = TemporalType.TIMESTAMP) Zugabe
  • Wenn Sie nicht wirklich brauchen die Zeitzone, in einem Datum oder Zeitstempel-Feld setzen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top