Existe-t-il un problème avec les propriétés JPA Entities, Oracle 10g et Calendar Type?

StackOverflow https://stackoverflow.com/questions/82235

  •  09-06-2019
  •  | 
  •  

Question

J'éprouve le comportement très gênant suivant lorsque j'utilise des entités JPA avec Oracle 10g.

Supposons que vous ayez l'entité suivante.

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

Cette entité est mappée sur Oracle 10g. Ainsi, dans la base de données, il y aura une table T_ORDER avec une colonne primaire de clé primaire NUMBER "ID". et une colonne TIMESTAMP "activationDate".

Supposons que je crée une instance de cette classe avec la date d’activation "15. Sept. 2008 00:00 " ;. Mon fuseau horaire local est CEST, l'heure GMT + 02h00. Lorsque je persiste dans cet objet et que je sélectionne les données de la table T_ORDER à l'aide de sqlplus, je découvre que dans la table, en réalité "14. Sep 2008 22: 00 " est stocké, ce qui est le cas jusqu'à présent, car le fuseau horaire d’oracle db est GMT.

Mais maintenant la partie ennuyante. Lorsque je relis cette entité dans mon programme JAVA, je découvre que le fuseau horaire d’Oracle est ignoré et j’obtiens «14. Sept. 2008 22:00 CEST ", ce qui est vraiment faux.

Donc, en gros, lors de l'écriture dans la base de données, les informations du fuseau horaire seront utilisées, lors de la lecture, elles seront ignorées.

Existe-t-il une solution pour cela? La solution la plus simple, je suppose, serait de régler le fuseau horaire d’Oracle dbs sur GMT + 02, mais malheureusement, je ne peux pas le faire car d’autres applications utilisent le même serveur.

Nous utilisons la technologie suivante

MyEclipse 6.5 JPA avec Hibernate 3.2 Pilote JDBC mince Oracle 10g

Était-ce utile?

La solution

Vous ne devez pas utiliser un calendrier pour accéder aux dates de la base de données, pour cette raison exacte. Vous devez utiliser java.util.Date comme suit:

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

java.util.Date pointe vers un instant donné, quel que soit le fuseau horaire. Vous pouvez utiliser le calendrier pour formater une date pour un fuseau horaire ou des paramètres régionaux.

Autres conseils

J'ai déjà eu ma part de problèmes avec JPA et les horodatages. J'ai lu les forums oracle et vérifiez les éléments suivants. :

  • Le champ de la base de données doit être TIMESTAMP_TZ et pas uniquement TIMESTAMP
  • Essayez d'ajouter l'annotation @Temporal (value = TemporalType.TIMESTAMP)
  • Si vous n'avez pas vraiment besoin du fuseau horaire, indiquez un champ de date ou d'horodatage.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top