IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Imprecision des valeurs dates avec hibernate


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Imprecision des valeurs dates avec hibernate
    Bonsoir. Je développe avec hibernate. j'ai fais une requete hql retournant des entités contenant un champ date. les entités retournés sont juste mais seulement les valeurs des dates ne sont pas juste. les dates sont retourné avec des valeurs d'un ou deux jours de moins.
    Lorsque je fais la même requete avec SQL SERVEUR 2008 je n'ai pas de problème de précision.
    Dans sql serveur le type du champ est date. Et dans le fichier de mapping j'utilise également le type date.
    Voici la requete:
    Voici mes mapping:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    <hibernate-mapping>
        <class name="entity.produit.Taxe" table="Taxe" schema="dbo" catalog="STATION">
            <id name="idTaxe" type="int">
                <column name="idTaxe" />
                <generator class="assigned" />
            </id>
            <property name="nomTaxe" type="string">
                <column name="nomTaxe" length="254" not-null="true" unique="true" />
            </property>
            <property name="taxeEtatique" type="java.lang.Boolean">
                <column name="taxeEtatique" />
            </property>
            <property name="valTaxeActuel" type="double">
                <column name="valTaxeActuel" precision="53" scale="0" not-null="true" />
            </property>
            <set name="detailsTaxes" inverse="true">
                <key>
                    <column name="idTaxe" not-null="true" />
                </key>
                <one-to-many class="entity.produit.DetailsTaxe" />
            </set>
            <set name="valeurTaxes" inverse="true">
                <key>
                    <column name="idTaxe" not-null="true" />
                </key>
                <one-to-many class="entity.produit.ValeurTaxe" />
            </set>
        </class>
    </hibernate-mapping>
     
     
     <class name="entity.produit.ValeurTaxe" table="ValeurTaxe" schema="dbo" catalog="STATION">
            <id name="idValTaxe" type="int">
                <column name="idValTaxe" />
                <generator class="assigned" />
            </id>
            <many-to-one name="taxe" class="entity.produit.Taxe" fetch="select">
                <column name="idTaxe" not-null="true" />
            </many-to-one>
            <property name="dateDebValTaxe" type="date">
                <column name="dateDebValTaxe" length="10" />
            </property>
            <property name="valTaxe" type="java.lang.Double">
                <column name="valTaxe" precision="53" scale="0" />
            </property>
            <property name="dateFinValTaxe" type="date">
                <column name="dateFinValTaxe" length="10" />
            </property>
        </class>
    </hibernate-mapping>

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 100
    Points : 161
    Points
    161
    Par défaut
    Bonjour
    essaye de préciser le type des date que tu utilisé
    type="java.util.Date" ou "java.sql.Date"

    ainsi quel framwork autre tu utilise? je ne pense pas que hibernate qui te pose le pb.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    J'ai eu le même genre de "gag" avec Oracle. A chaque sauvegarde des données hibernante, la date reculait d'un jour


    Ton problème principal, c'est qu'il n'existe pas en java de type "Date" au sens de SQL. Le type data java inclu les heures => Il est fortement lié à la timezone utilisée. En revanche, ton serveur SQL gère le type date, donc il tronque systématiquement la partie "heure" quand on stocke de données.


    Quand tu met ça ensemble, ça donne ceci:

    Serveur SQL: 5 juillet 2013 (par exemple)
    JDBC: crée un objet Date correspondant au 5 juillet 2013 00:00 GMT+2 (Europe/Paris), vu que c'est la locale de ton serveur SQL
    Hibernate: Stocke cet objet Date sagement dans ton entité
    Formulaire d'affichage: affiche la date en GMT (ce qui arrive souvent quand on ne précise rien ^^), donc affiche 4 juillet 2013 22:00 GMT. Mais comme on n'affiche pas les heures, on fini avec "4 juillet 2013" sur l'interface.

    Note que "5 juillet 2013 00:00 GMT+2" et "4 juillet 2013 22:00 GMT" c'est exactement le même moment, affiché différemment!

    On continue. Tu fais pas gaffe. Tu sauve ton formulaire après édition. Tu stocke donc dans ton entité maintenant 4 juillet 2013 00:00 GMT.
    JDBC envoie vers le serveur SQL 4 juillet 2013 02:00 GMT+2
    Le serveur SQL stockant des dates tronque la partie temporelle et stocke 4 juillet 2013

    Et à la prochaine lecture, on reculera à nouveau d'un jour.


    La solution, quand tu travaille sur des dates en tronquant l'heure en java, toujours, de bout en bout, utiliser la même timezone! (Depuis l'interface, jusqu'à la connexion jdbc).

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 6 887
    Points
    6 887
    Par défaut
    Juste pour info, le type DATE en Oracle stocke également l'heure.

    Par contre, il me semblait que ces problèmes de TZ étaient géré automatiquement ? Parce que quelque soit le TZ, le timestamp est le même.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Par contre, il me semblait que ces problèmes de TZ étaient géré automatiquement ? Parce que quelque soit le TZ, le timestamp est le même.
    Tu m'a fait rechercher pour voir si j'avais pas fait une bêtise par le passé, mais non

    Au niveau DB, le type Date oracle n'embarque pas de timezone. Le type timestamp non plus. Pour embarquer la timezone il faut un Timestamp with timezone:


    Au niveau java, le type Date non plus n'embarque pas de timezone.

    Le problème, c'est que le rendu textuel / le parsing, au niveau java nécessite une timezone. D'ou des problèmes de conversions. Et apparement, le driver JDBC oracle fait aussi une popotte interne (genre n'envoyer que la partie date) du coup je me retrouve avec des données tronquées (c'est le but). Mais mal tronquées

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 6 887
    Points
    6 887
    Par défaut
    Pour moi c'est un bug de Java ou du driver ... Mais bon il faut faire avec ... Sinon c'était pas un problème de NLS ?

    Quelque soit le timezone le temps écoulé depuis 01 Janvier 1970 00:00:00 GMT est le même partout.

    Enfin bref, je pense aussi que ca peut être une piste sérieuse pour le problème rencontré par abou oussein.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    oracle ne stocke pas les dates comme ça

    C'est quasiment du stockage textuel dans oracle.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/01/2013, 14h59
  2. gestion des Schema oracle avec hibernate
    Par fbo1276 dans le forum Hibernate
    Réponses: 2
    Dernier message: 19/11/2007, 17h53
  3. Pas d'affichage des valeurs nulles avec un COUNT
    Par phoenixz22 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 30/05/2007, 18h39
  4. [MySQL] Importer des valeurs "date" depuis fichier csv
    Par all42 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/05/2007, 10h23
  5. Réponses: 2
    Dernier message: 17/05/2006, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo