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 :

Probleme autoincrement id


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Probleme autoincrement id
    Bonjour.

    Je suis en train de découvrir hibernate (hibernate-release-4.3.1.Final.jar) et je rencontre un problème lors de la sauvegarde d'un objet.

    En base de données, j'ai la table CPTE_TARIF qui contient un id.
    Cette table appartient à l'utilisateur CPTEADM.

    L'application se connecte via l'utilisateur CPTECLI qui a les droits de lecture/insert/update/delete sur toutes les tables de CPTEADM.

    Le mapping est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     <class name="hibernate.CpteTarif" schema="CPTEADM" table="CPTE_TARIF">
      <id name="tarId" type="long">
       <column name="TAR_ID" precision="22" scale="0"/>
       <generator class="increment"/>
      </id>
    ...
    Lors de la lecture d'un objet via hibernate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<CpteTarif> list2 = session.createQuery("from CpteTarif").list(); 
    ou
     list2 = session.createCriteria(CpteTarif.class).list();
    le sql généré est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select 
    cptetarif0_.TAR_ID as TAR_ID1_0_, cptetarif0_.TAR_LIBELLE as TAR_LIBELLE2_0_, 
    cptetarif0_.TAR_NOM_ARTICLE as TAR_NOM_ARTICLE3_0_, cptetarif0_.TAR_GROUPE_MARCHANDISE as TAR_GROUPE_MARCHAN4_0_ 
    from CPTEADM.CPTE_TARIF cptetarif0_
    --> on voit bien que le nom de user propriétaire est marqué devant le nom de la table. Le SQL fonctionne donc.


    Par contre, lors de la création d'un objet via le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CpteTarif toto = new CpteTarif("libelle", "nomA", "grpM",new HashSet<CpteTarifvaleur>());
    session.beginTransaction();
    session.save(toto);
    session.getTransaction().commit();
    Le premier sql généré est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hibernate: select max(TAR_ID) from CPTE_TARIF
    --> on voit que le nom du user n'est pas marqué devant la table.
    On a donc une erreur oracle "ORA-00942: Table ou vue inexistante" tout à fait normale.
    Une solution serait alors de mettre des "public synonyme" sur la base, mais ce n'est pas ce qui est souhaité.

    Pourquoi hibernate ne mets pas le nom du user "tout seul" lors de la recherche du max, ce qu'il fait pour toutes les autres requêtes.

    Merci d'avance.

  2. #2
    Expert éminent
    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
    Par défaut
    Je suppose que ce generateur ne supporte pas les schemas (bug?). De toutes façons, il n'est pas recommandable comme generator, vu qu'il nécessite que personne d'autre n'accède à la table en même temps.

    Tu peux essayer ça pour contourner
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <class name="hibernate.CpteTarif" table="CPTEADM.CPTE_TARIF">
      <id name="tarId" type="long">
       <column name="TAR_ID" precision="22" scale="0"/>
       <generator class="increment"/>
      </id>

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Alors, de mémoire, avec les tables Oracle j'utilisais un generateur de type "SEQUENCE"
    Au niveau mapping, ça ressemble à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <generator class="sequence">
          <param name="sequence">USERS_1SQ</param>
    </generator>
    Pour le paramétrage du séquenceur dans Oracle, il faut regarder la doc, je ne m'en souviens plus
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Invité
    Invité(e)
    Par défaut
    pour l'utilisation des sequences ou max(id), je verrai ce que j'utliserai.

    pour le problème d’accès à la table d'un autre user et afin que ca fonctionne dans tous les cas, il suffisait de mettre dans le fichier hibernate.cfg.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.default_schema">CPTEADM</property>
    .

    Par contre, j'ai une autre question, peut être que vous allez pouvoir me répondre, vu que c'est très simple

    un Tarif contient une liste de valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <set name="cpteTarifvaleurs" table="CPTE_TARIFVALEUR" inverse="true" lazy="true" fetch="select">
                <key>
                    <column name="TAR_ID" precision="22" scale="0" not-null="true" />
                </key>
                <one-to-many class="hibernate.CpteTarifvaleur" />
            </set>
    Pour ajouter (et sauvegarder) une valeur à un tarif, comment faut-il faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CpteTarif montarif =  (CpteTarif) session.get(CpteTarif.class, 2);
    CpteTarifvaleur val = new CpteTarifvaleur(montarif, new Date(), null, new BigDecimal(20));
    session.getTransaction().begin();
    session.save(val);
    session.getTransaction().commit();
    --> cela fonctionne, cela insert bien une ligne de valeur dans la table CPTE_TARIFVALEUR
    ensuite, pour recharger le tarif (avec sa liste de valeur à jour), il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    montarif=(CpteTarif) session.get(CpteTarif.class, 2);
    Par contre, si je fait cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CpteTarifvaleur val2 = new CpteTarifvaleur(montarif, new Date(), null, new BigDecimal(30))
    montarif.getCpteTarifvaleurs().add(val2);
    session.getTransaction().begin();
    session.save(montarif);
    session.getTransaction().commit();
    --> cela sauvegarde le tarif, mais ne sauvegarde pas la liste de valeurs dans la table CPTE_TARIFVALEUR
    Est-ce normal?

    Cdt

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il faut préciser l'attribut "cascade" dans ton mapping de tarif (pour la liste)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Invité
    Invité(e)
    Par défaut
    C'est super cette fonctionnalité.

    Par contre, je suppose que cela doit être utilisé avec parcimonie afin de ne pas mettre à jour l'ensemble des listes pouvant découler?

    Sauf si que vu qu'hibernate fait les requête SQL que s'il détecte un update/insert/delete à faire, cela peut être utile d'etre régulièrement en cascade?

    Qu'en pensez vous? ou conseillez vous avec du recul?

    Cdt

  7. #7
    Expert éminent
    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
    Par défaut
    ça ne met à jour que les listes qui ont changé, donc en général, on met le cascade. Il est rare de modifier un objet pour au final se dire "je ne vais sauver qu'un partie de l'objet finalement"

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

Discussions similaires

  1. probleme champ autoincrement
    Par Daniela dans le forum Modélisation
    Réponses: 1
    Dernier message: 23/12/2010, 11h37
  2. probleme avec le champs de type "autoincrement"
    Par hayat2 dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/05/2010, 09h28
  3. Probleme avec autoincrement Mysql Jsf
    Par dalidali86 dans le forum Requêtes
    Réponses: 0
    Dernier message: 10/09/2009, 00h18
  4. Réponses: 4
    Dernier message: 25/11/2008, 18h34
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50

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