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 :

AutoIncrémentation dans une transaction


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut AutoIncrémentation dans une transaction
    Bonjour,

    Au sein d'une même transaction (avant le commit donc) j'ajoute N enregistrements dont un des attributs est de type autoincrément.

    Hibernate ne résout l'attribut qu'au moment du commit, donc les valeurs sont mises à 0 en attendant.

    Mon problème, c'est si l'attribut autoincrémenté est ma clé primaire, ça saute en me lachant un NonUniqueObjectException, ce qui me fait une belle jambe.

    Il est possible que plusieurs transactions se fassent en mm temps, donc je peux pas juste récuperer l'index max + 1, car ça ne changera rien.

    Comme cet ajout se fait dans une boucle, je ne vais pas non plus m'amuser a ouvrir et fermer N transactions.

    Donc j'aimerais savoir s'il existe une feinte prévue par hibernate ou si je suis
    dans la m*rde..

    En fait, l'idéal serait de pouvoir refiler un unique id temporaire a mes enregistrement, puis de l'ajouter a la base à la bonne valeur au moment du commit :/

    Merci d'avance.
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    salut,
    Bizarre ton problème, et il se peut que ça vienne d'ailleurs, parce que moi aussi dans mon code je fais des insertions de collections d'objets avec id auto-incrément (relation one-to-many avec inverse="true" et cascade="all") au sein d'une même transaction et ça ne pose aucun problème. En principe, Hibernate utilise la valeur de l'attribut optionnel unsaved-value pour distinguer un objet qui vient d'être instancié (non sauvergardé) par rapport à un objet détaché. La doc hibernate dit que cet attribut pour le champ ID n'est presque jamais nécessaire dans hibernate 3, vérifie peut-être que ça vient de là, au cas où tu aurais indiqué unsaved-value="0", essaie de l'enlever pour voir.
    En espérant que ça aide.
    SCJP 5 / SCBCD 1.3 Certified

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    En fait je suis passé super vite sur hibernate, parce que c'est une toute petite partie de mon projet, donc c'est pour ça que je suis perdu, il doit y avoir une façon simple de faire..

    Du coup je connais pas toute la partie one-to-many et compagnie, donc je vais jeter un coup d'oeil, et je verrais si ça vient de la.

    Merci bcp
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Bon, je me suis documenté sur hibernate, mais je trouve toujours pas ce que je veux.

    Voila un exemple concret :

    J'ai une table dans laquelle on empile des statistiques. Les attributs sont date, catégorie, s1, s2, s3. La clé primaire est un id auto incrémenté qui n'a aucune importance, mais qui est la par obligation.

    Je reçois un message de stat comprenant 50 nouvelles entrées :
    J'ouvre ma transaction, je crée les 50 objets, je commit. C'est l'idée normalement.

    Sauf que la résolution de l'auto increment ne se fait qu'au moment du commit. Donc a la création de chaque objet représentant l'entrée, il met une valeur par défaut en clé primaire, la même pour chaque entrée, donc ça saute.

    Si j'essaye de forcer la clé a une certaine valeur, au moment du commit il va me mettre cette valeur et non la valeur auto incrémentée.

    Donc je ne peux pas utiliser les clauses <generator>.

    Dans cette table, il n'y a aucune relation avec quoi que ce soit, c'est juste une entrée comme ça, donc pas de many-to-one ou one-to-many ou autre.

    Enfin, je peux pas me permettre d'ouvrir et de fermer les transactions a chaque entrée, sous peine de saturer la base (pke en pratique c'est pas 50 mais 5000 entrées en un coup).

    Voila, en espérant que qqun saura me donner la réponse ou me mettre sur la voie, du moment que c'est suffisement clair pour que je comprenne..

    Merci d'avance
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Faiche
    Je reçois un message de stat comprenant 50 nouvelles entrées :
    J'ouvre ma transaction, je crée les 50 objets, je commit. C'est l'idée normalement.
    Bonjour,
    Et si tu essayais de créer d'abord les objets en les stockant dans une liste, ouvrir la transaction, enregistrer les données, puis commiter la transaction? Quelque chose comme :
    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
     
    ...
    List<Stat> stats = new ArrayList<Stat>();
    stats.add(stat1);
    stats.add(stat2);
    ...
    stats.add(stat50);
     
    // puis ouvrir la transaction
    session.beginTransaction();
     
    //sauvegarder les objets
    for(Stat stat : stats) {
        session.save(stat);
    }
     
    // commiter la transaction
    session.getTransaction().commit();
    Bon, évidemment je ne donne là que les grandes lignes, je ne sais pas comment tu obtiens ta liste de Stats ni comment tu gères tes transactions (par Spring peut-être ?), mais c'est juste l'idée que je voulais faire passer, et je n'ai pas testé si ça marche ou pas. Vois un peu ce que ça donne.
    En espérant que ça aide.
    SCJP 5 / SCBCD 1.3 Certified

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    En fait, juste avant la création, je récupere une info ailleurs dans la table, ce qui explique que j'ouvre ma transaction avant, mais le reste du code est identique.

    C'est juste que quand je crée mon objet, il met l'id a la valeur par défaut, et quand je fais le premier save, ça va, mais le deuxieme ça va plus, puisqu'il a le même id par défaut.

    Ce qui me gène c'est que c'est un problème évident, et qu'ils ont surement pensé a un truc pour gerer ce cas précis, mais j'arrive pas a le trouver dans la masse d'information des doc hibernate, j'ai même pas une piste..
    Venez partager vos expériences au sein d'un projet sur slicesofit, agile & amélioration continue

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Pourrais-tu nous montrer ton code ? ça aiderait peut-être à y voir plus clair.
    SCJP 5 / SCBCD 1.3 Certified

Discussions similaires

  1. [C#/MySQL] Peut-on faire plusieurs requêtes dans une Transaction ?
    Par Ben42 dans le forum Accès aux données
    Réponses: 5
    Dernier message: 01/02/2011, 09h16
  2. [ADO] Requete qui ne s'execute pas dans une transaction
    Par Faboul dans le forum VBA Access
    Réponses: 1
    Dernier message: 17/07/2007, 13h30
  3. Select dans une transaction
    Par Safaritn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/03/2007, 00h21
  4. probleme d'insertion dans une transaction
    Par iam dans le forum Bases de données
    Réponses: 1
    Dernier message: 17/05/2006, 10h18
  5. Réponses: 2
    Dernier message: 20/03/2006, 09h39

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