Domanda

Ho riscontrato il seguente molto fastidioso comportamento quando si utilizza JPA entitys in collaborazione con Oracle 10g.

Si supponga di avere la seguente ente.

@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;
    }
}

Questa entità è associata a Oracle 10g, in modo che nel DB ci sarà un tavolo T_ORDER con una chiave primaria NUMERO di colonna "ID" e una colonna di tipo TIMESTAMP "activationDate".

Supponiamo creare un'istanza di questa classe con la data di attivazione "15.Sep 2008 00:00".Il mio fuso orario locale è CEST, che è GMT+02:00.Quando ho persistere di questo oggetto e selezionare i dati dalla tabella T_ORDER utilizzando sqlplus, scopro che nella tabella realtà "14.Sep 2008 22:00" viene memorizzato, che è ok, perché oracle db fuso orario è GMT.

Ma ora la parte noiosa.Quando ho letto questa entità nel mio programma JAVA, scopro che la oracle fuso orario viene ignorato e ho "14.Sep 2008 22:00 CEST", che è sicuramente sbagliato.

Quindi, in pratica, durante la scrittura sul DB le informazioni di fuso orario, saranno utilizzati, durante la lettura verrà ignorato.

C'è qualche soluzione per questo là fuori?La soluzione più semplice credo, impostare il db oracle fuso orario a GMT+02, ma purtroppo non posso farlo, perché ci sono altre applicazioni che utilizzano lo stesso server.

Utilizzare il seguente tecnologia

MyEclipse 6.5 JPA con Hibernate 3.2 Oracle 10g sottile Driver JDBC

È stato utile?

Soluzione

Si dovrebbe utilizzare un Calendario per accedere date dal database, per questo motivo esatto.Si dovrebbe usare java.util.Date così:

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

java.util.Date punti per un momento nel tempo, a prescindere dalle eventuali fusi orari.Calendario può essere utilizzato per formattare una data per un determinato fuso orario locale.

Altri suggerimenti

Ho già avuto la mia parte di problemi con JPA e timestamp.Ho letto in oracle forum e si prega di controllare il seguente:

  • Il campo nel database dovrebbe essere TIMESTAMP_TZ e non solo TIMESTAMP
  • Prova ad aggiungere l'annotazione @Temporali(valore = TemporalType.TIMESTAMP)
  • Se non si ha realmente bisogno il fuso orario, mettere in una data o un campo di tipo timestamp.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top