2008-09-17 4 views
2

Je rencontre le comportement très ennuyeux suivant lors de l'utilisation d'entités JPA en conjonction avec Oracle 10g.Y a-t-il un problème avec les entités JPA, Oracle 10g et les propriétés Type de calendrier?

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 associée à Oracle 10g, donc dans le DB, il y aura une table T_ORDER avec une colonne de clé primaire NOMBRE « ID » et une colonne TIMESTAMP « activationDate ».

Supposons que je crée une instance de cette classe avec la date d'activation "15. Sep 2008 00:00 AM". Mon fuseau horaire local est CEST, soit GMT + 02: 00. Quand je persiste cet objet et sélectionne les données de la table T_ORDER en utilisant sqlplus, je découvre que dans la table en fait "14. Sep 2008 22:00" est stocké, ce qui est ok jusqu'ici, car le fuseau horaire d'oracle db est GMT.

Mais maintenant, la partie ennuyante. Quand je lis cette entité dans mon programme JAVA, je découvre que le fuseau horaire de l'oracle est ignoré et je reçois "14. Sep 2008 22:00 CEST", ce qui est définitivement faux. Donc, fondamentalement, lors de l'écriture dans le DB, les informations de la fuseau horaire seront utilisées, lorsque la lecture sera ignorée.

Existe-t-il une solution pour cela? La solution la plus simple serait de définir le fuseau horaire oracle dbs sur GMT + 02, mais malheureusement je ne peux pas le faire car il y a d'autres applications utilisant le même serveur.

Nous utilisons la technologie suivante

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

Répondre

2

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

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

java.util.Date des points à un moment dans le temps, quelles que soient les fuseaux horaires. Le calendrier peut être utilisé pour formater une date pour un fuseau horaire ou un environnement local particulier.

0

Je l'ai déjà eu ma part de problèmes avec JPA et horodatages. Je l'ai lu dans le oracle forums et s'il vous plaît vérifier les points suivants:

  • Le champ dans la base de données devrait être TIMESTAMP_TZ et pas seulement TIMESTAMP
  • Essayez d'ajouter l'annotation @Temporal (valeur = TemporalType.TIMESTAMP)
  • Si vous n'avez pas vraiment besoin du fuseau horaire, insérez un champ de date ou d'horodatage.
+0

Merci d'avoir répondu. Je suis tombé par hasard sur le même fil de forum oracle que vous mentionnez ci-dessus. Malheureusement toutes les solutions données sont liées à quelque chose appelé EclipseLink et je ne veux vraiment pas passer à une nouvelle implémentation de l'API de persistance. – huo73

+0

Les annotations sont des annotations JPA non spécifiques à eclipselink. Je l'ai utilisé avec Hibernate et ils fonctionnent bien. – JeroenWyseur

Questions connexes