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 :

Concurrence optimiste avec Hibernate


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 61
    Par défaut Concurrence optimiste avec Hibernate
    Bonjour à tous,

    J'aurais besoin d'aide, afin de gérer la concurrence optimiste d'Hibernate. J'ai fait le tour de la documentation officielle, ainsi que d'autre docs diverses, malheureusement, je ne trouve pas réponse à mes questions. Vous êtes donc mon dernier recours!

    Mise en situation:
    Un projet utilisant Spring et Hibernate. Nous avons des objets mappés à des tables Oracle par Hibernate en utilisant des annotations. Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Entity
    @Table(name = "MEDECIN", uniqueConstraints = {@UniqueConstraint(columnNames = {"NO_PERMIS"})})
     
    public class Medecin extends AbstractMedecin {
    (...)
    }
    Dans celle-çi, conformément à la procédure expliquée (très mal) sur le site d'Hibernate, j'ai ajouté un champ VERSION dans la table MEDECIN, et aussi dans mon objet, avec les annotations pour la concurrence optimiste d'Hibernate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Version
    @Column(name="VERSION")
    protected Integer version;
    Dans ma base de donnée Oracle, le champ VERSION est "INTEGER NOT NULL, DEFAULT 0". Le problème, c'est qu'Hibernate n'incrémente pas du tout ce champ lorsqu'une mise à jour est effectuée sur l'objet mappé. Donc la gestion de concurrence optimiste ne peut pas fonctionner.

    Même en spécifiant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @org.hibernate.annotations.Entity(optimisticLock = org.hibernate.annotations.OptimisticLockType.VERSION)
    ...au debut de ma classe mappé, ça ne fonctionne tout simplement pas (pas d'incrémentation par Hibernate).

    Merci de me diriger vers des pistes. Le principe semble relativement simple... il y a certainement quelque chose qui m'a échappé.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    Arf, je vois rien qui pourrait empécher l'incrément par Hibernate...
    Tu importes l'annotation Version depuis quel package ?

    Citation Envoyé par whorian Voir le message
    Bonjour à tous,

    J'aurais besoin d'aide, afin de gérer la concurrence optimiste d'Hibernate. J'ai fait le tour de la documentation officielle, ainsi que d'autre docs diverses, malheureusement, je ne trouve pas réponse à mes questions. Vous êtes donc mon dernier recours!

    Mise en situation:
    Un projet utilisant Spring et Hibernate. Nous avons des objets mappés à des tables Oracle par Hibernate en utilisant des annotations. Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Entity
    @Table(name = "MEDECIN", uniqueConstraints = {@UniqueConstraint(columnNames = {"NO_PERMIS"})})
     
    public class Medecin extends AbstractMedecin {
    (...)
    }
    Dans celle-çi, conformément à la procédure expliquée (très mal) sur le site d'Hibernate, j'ai ajouté un champ VERSION dans la table MEDECIN, et aussi dans mon objet, avec les annotations pour la concurrence optimiste d'Hibernate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @Version
    @Column(name="VERSION")
    protected Integer version;
    Dans ma base de donnée Oracle, le champ VERSION est "INTEGER NOT NULL, DEFAULT 0". Le problème, c'est qu'Hibernate n'incrémente pas du tout ce champ lorsqu'une mise à jour est effectuée sur l'objet mappé. Donc la gestion de concurrence optimiste ne peut pas fonctionner.

    Même en spécifiant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @org.hibernate.annotations.Entity(optimisticLock = org.hibernate.annotations.OptimisticLockType.VERSION)
    ...au debut de ma classe mappé, ça ne fonctionne tout simplement pas (pas d'incrémentation par Hibernate).

    Merci de me diriger vers des pistes. Le principe semble relativement simple... il y a certainement quelque chose qui m'a échappé.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 59
    Par défaut
    Comme le dit denisjava, cela dervait fonctionner, j'utilise exactement le même code excepté que mon champ de version est un Timestamp mais la doc de hibernate précise bien que :
    Les numéros de version doivent avoir les types Hibernate long, integer, short, timestamp ou calendar.
    Donc normalement aucun problème pour toi. Maintenant, ça peut être du a un probleme de Session ou de Transaction peut-être ?
    Il faudrait ton fichier de config Spring et hibernate pour plus de détails.
    Tu peux peut-être aussi spécifier le niveau de log de hibernate à "DEBUG" pour avoir plus de précision sur le SQL qu'il génère. (avec log4j : "log4j.logger.org.hibernate.SQL=DEBUG" )

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    Effectivement, tu dis que le numéro de version n'est pas incrémenté, mais l'enregistrement versionné est il mis à jour: une requete UPDATE est elle générée ?
    elle devrait ressember à: UPDATE ... WHERE ID=XX AND VERSION=XX

    Citation Envoyé par YeFFreY Voir le message
    Comme le dit denisjava, cela dervait fonctionner, j'utilise exactement le même code excepté que mon champ de version est un Timestamp mais la doc de hibernate précise bien que :

    Donc normalement aucun problème pour toi. Maintenant, ça peut être du a un probleme de Session ou de Transaction peut-être ?
    Il faudrait ton fichier de config Spring et hibernate pour plus de détails.
    Tu peux peut-être aussi spécifier le niveau de log de hibernate à "DEBUG" pour avoir plus de précision sur le SQL qu'il génère. (avec log4j : "log4j.logger.org.hibernate.SQL=DEBUG" )

  5. #5
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 61
    Par défaut
    Rebonjour messieux,

    1. Effectivement une requête UPDATE est générée.

    2. Le package utilisé pour les annotations @Version et @Column sont:

    import javax.persistence.Version;
    import javax.persistence.Column;

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    Et dans l'update, il tient compte du champ version ? tu peux nous faire un copier coller de la requete sql ?


    Citation Envoyé par whorian Voir le message
    Rebonjour messieux,

    1. Effectivement une requête UPDATE est générée.

    2. Le package utilisé pour les annotations @Version et @Column sont:

    import javax.persistence.Version;
    import javax.persistence.Column;

  7. #7
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 61
    Par défaut
    Mon champ VERSION est maintenant incrémenté. Cependant, la gestion de la concurrence ne peut pas fonctionner, parce que Hibernate me fait des requêtes UPDATE pour l'affichage d'une entité (read-only).

    C'est pourquoi maintenant, toute modification d'une entité me lance une exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: JDBC commit failed
     
    cause mère 
     
    java.sql.SQLException: ORA-02091: transaction annulée
    ORA-00001: violation de contrainte unique (ALT_MEDECIN)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/04/2011, 12h09
  2. [Hibernate] Problème avec Hibernate et Eclipse 3
    Par theseuby dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/03/2006, 21h31
  3. Connection de SQL SERVER 2005 EXPRESS avec HIBERNATE
    Par jerome giraud dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/02/2006, 09h07
  4. [Plugin][Hibernate]Eclipse avec hibernate(synchronizer)
    Par mg67 dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 23/06/2005, 17h19
  5. Problèmes avec Hibernate (sous Eclipse)
    Par Pierric dans le forum Hibernate
    Réponses: 2
    Dernier message: 07/04/2005, 14h35

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