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 :

Index différent entre base et code lors d'un save


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Index différent entre base et code lors d'un save
    Bonjour

    Je ne trouve pas de correspondance à mon problème sur le net.

    Je créé un objet puis je le sauve en base. Il se voit attribuer un numéro d'index (avec une séquence). Or, l'index retourné est différent de celui qui apparait réellement en base de données. Ce dernier est systématiquement supérieur de 1 à celui que j'ai dans l'application.

    Le fichier de mapping

    Code : 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
     
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="Transports" table="transports" catalog="regulation">
    		<id name="idTransports" type="int">
    			<column name="idTransports" not-null="true" />
    			<generator class="native" />
    		</id>
    		<many-to-one name="vehicule" class="Vehicule" fetch="select" lazy="false">
    			<column name="Vehicule" not-null="false">
    			</column>
    		</many-to-one>
    		<set name="transports" inverse="true" table="transport" lazy="false" order-by="rendezVous">
    			<key>
    				<column name="idTransport"></column>
    			</key>
    			<one-to-many class="Transport" />
    		</set>
    	</class>
    </hibernate-mapping>
    le code de sauvegarde

    Code : 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
     
    	public Transports sauveTransports(Transports transports){
    		Session session = null;
    		Transaction tx = null;
    		try {
    			session = getSessionFactory().openSession();
    			tx = session.beginTransaction();
    			session.saveOrUpdate(transports);
    			tx.commit();
    		} catch (Exception e) {
    			if (tx != null) tx.rollback();
    			logger.error(e.getMessage());
    		} finally {
    			logger.debug("Fin de sauveTransports");
    			session.close();
    		}
    		return transports;
        }
    un point d'arret sur la dernière ligne fait apparaitre transports.idtransports = 1
    alors que la base montre 2

    Une idée

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Je n'ai pas vraiment de solution mais une piste ou tu pourrais peut être creuser. Le problème pourrais être le suivant : Hibernate récupère un index pour ton objet qui est la valeur courante de la séquence et insère dans la base ton objet avec la valeur suivante de la séquence. Fais des test et dis moi ce que tu en pense on pourra peu être avancer sur ce point.

    Bon courage

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Pourquoi utilises tu "native" dans ton mapping si tu veux utiliser une séquence ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour et merci de vous intéresser à mon problème.

    J'utilise native parce que je ne travaille pas toujours avec Oracle. Le système est aussi déployé avec MySQL.

    La séquence fonctionne très bien dans les autres objets avec native. En fait, je n'ai jamais testé si le problème de discordance entre la base et le code étaient présent. En tout cas, ça fonctionne sans problème.

    Dans mon code, je commence par persister le transports avant de l'utiliser pour une relation. Le fait est que je me retrouve avec une association qui pointe vers un enregistrement qui n'existe pas. Dans oracle, je n'ai pas mis de contrainte sur une clé étrangère sinon, j'aurai eu la sanction immédiate avec une contrainte d'intégrité non respectée.

    Je regarde si en cascadant le save dans mes objets pères on contourne ce problème.

    Il n'en demeure pas moins que j'aimerais comprendre pourquoi hibernate me renvoit un index différent de celui qui est sauvegardé???

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    C'est juste un détail de langage, mais une séquence est une façon de générer des nombres auto-incrémentés et n'existe pas sur tous les SGBD.
    Donc native, n'est pas une séquence.


    Pour ton problème, que fais tu avec ta relation qui ferait que ça ne marche pas ?
    Comment la sauvegardes tu ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par fr1man Voir le message
    C'est juste un détail de langage, mais une séquence est une façon de générer des nombres auto-incrémentés et n'existe pas sur tous les SGBD.
    Donc native, n'est pas une séquence.
    Oui, je suis d'accord. C'est pour cela que je n'ai pas mentionné Oracle dans le Post initial. Il s'agit ici d'un problème peut être un peu plus générique. En oracle hibernate utilise une séquence alors qu'en MySQL il utilise un index auto-incrémenté.

    Citation Envoyé par fr1man Voir le message
    Pour ton problème, que fais tu avec ta relation qui ferait que ça ne marche pas ?
    Comment la sauvegardes tu ?
    Il existe une relation one-to-many entre transports et transport (désolé pour la faiblesse sémantique). Dans la base, je n'ai pas mis de contrainte entre ces deux tables.
    Dans le code, je veux par moment créer un transports (un regroupement de transports) puis sauvegarder mon transport.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Transport transport1 = .....
    Transport transport2 = .....
    Transports groupe = new Transports();
    groupe.getTransports().add(transport1);
    transport1.setTransports(groupe);
    groupe.getTransports().add(transport2);
    transport2.setTransports(groupe);
    // sauveTransports(groupe);
    sauveTransport(transport1);
    sauveTransport(transport2);
    Si je laisse le commentaire, je remonte une erreur sur l'état transient de mon groupe qui doit être sauvegardé avant de sauvegarder mes deux transport1 et transport2.
    Si je décommente, le groupe est sauvegardé avec deux numéros d'index différents (dans le code et dans la base).
    Lors du chargement suivant, j'ai une erreur car les transport1 et transport2 pointent vers un Transports (groupe) qui n'existe pas en base

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bon, je suis vert de rage ou rouge de honte; c'est au choix!!!

    J'ai créé ma nouvelle table avec APEX(l'utilitaire de gestion de base de données d'oracle en ligne) et je n'avais pas vu qu'il avait créé un trigger associé à la table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE TRIGGER  "BI_TRANSPORTS" 
      before insert on "TRANSPORTS"               
      for each row  
    begin   
        select "HIBERNATE_SEQUENCE".nextval into :NEW.IDTRANSPORTS from dual; 
    end;
    Bref, à chaque enregistrement lors d'une création, il venait chercher le prochain index de la séquence d'où le décalage mentionné dans le post initial.

    Moralité, ne faites jamais confiance à quelque chose qui prétend faire votre travail. Un bon vieux CREATE TABLE m'aurait évité de perdre 2 jours!!!

    Merci à tous

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

Discussions similaires

  1. tranfsert des données entre bases par code C#.
    Par solitude dans le forum C#
    Réponses: 4
    Dernier message: 04/11/2012, 22h50
  2. [AC-2000] Gestion des imports-exports en SQL entre bases différentes
    Par Gabout dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/06/2009, 17h06
  3. [Toutes versions] Copie entre bases différentes
    Par Gabout dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/06/2009, 10h58
  4. tri des données différent entre 2 bases
    Par j6m dans le forum Oracle
    Réponses: 2
    Dernier message: 12/03/2006, 10h17
  5. [ASCII] Codes différents entre 2 logiciels
    Par MinsK dans le forum Assembleur
    Réponses: 3
    Dernier message: 20/04/2004, 09h34

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