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

JPA Java Discussion :

Numéros de séquence qui se suivent


Sujet :

JPA Java

  1. #1
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2004
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2004
    Messages : 156
    Points : 90
    Points
    90
    Par défaut Numéros de séquence qui se suivent
    Bonjour,

    J'utilise JPA couplé avec Hibernate et une BDD Oracle, j'utilise une séquence pour générer des identifiants. Or lorsqu'il y a des rollbacks, il annule les insertions et donc les identifiants en BDD ne se suive pas.

    Comment les faire suivre ?

  2. #2
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 88
    Points : 106
    Points
    106
    Par défaut
    Bonjour,

    La séquence n'est pas sensible à la transaction. Ce qui est normal car si tu as deux transactions qui accèdent en même temps à la séquence, elles ne doivent pas avoir la même valeur.

    On peut jouer avec un "select for update" pour créer une sorte de verrou à la séquence mais je te le déconseille.

    La bonne question est plutôt pourquoi tu ne veux pas de trou dans ta séquence ?
    Sébastien

  3. #3
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2004
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2004
    Messages : 156
    Points : 90
    Points
    90
    Par défaut
    Les numéros doivent se suivre car cela est exigé, je ne cherche pas à les faire suivre pour le plaisir ;-). Il s'agit de numéro de facture.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    La solution est de gérer toi même ta séquence, c'est un peu périeux, mais faisable.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    La solution est de gérer toi même ta séquence, c'est un peu périeux, mais faisable.
    , dans ton cas effectivement les séquences me paraissent moins adaptées, la solution serait de récupérer avant chaque insertion le max Id, l’incrémenter et insérer. Donc une stratégie de génération de clé manuelle me parait aussi mieux adaptée.
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En sachant que tu va ralentir d'autant ton application!


    En effet, si le user A crée un facture, tu prend le numéro suivant dispo. (257 par exemple)
    Si en parallèe B crée un facture, il ne pourra pas le faire tant que A n'aura pas commité ou fait de rollback (ben oui, on doit utiliser 258 ou réutiliser le 257?)

    Bref, bon plaisir dans le code, mais dans tous les cas tu va devoir marquer dans JPA que c'est un ID assigné et non pas une séquence

    Un autre solution serait d'essayer de laisser la DB gérer l'assignation des numéro de facture après le commit. Mais alors il te faudra une deuxième transaction pour relire la facture et connaitre son numéro.

    En tout cas, pour moi, la clé primaire devrait être distincte du numéro de facture. Un clé primaire est une donnée technique qui sert à relier des données entre-elles. Un numéro de facture est une donnée buisness qui ne devrait pas être soumises au contraintes de la techniques. (Autrement dit si demain ton client veux créer deux factures avec le même numéro, le logiciel devrait être facilement ajustable)

  7. #7
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2004
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2004
    Messages : 156
    Points : 90
    Points
    90
    Par défaut
    Effectivement la solution était de gérer moi-même mon numéro car les séquences ne sont pas rollbackable. J'ai donc utilisé une table fonctionnelle pour générer le numéro de séquence, elle fait ainsi parti de ma transaction et est donc rollbackable

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Un autre solution serait d'essayer de laisser la DB gérer l'assignation des numéro de facture après le commit. Mais alors il te faudra une deuxième transaction pour relire la facture et connaitre son numéro.
    … pas vraiment une deuxième transaction, mais un deuxième round-trip vers la database : étant read-only, l'aspect transctionnel n'est pas nécessaire pour obtenir le numéro de facture alloué…

    et comme on est dans un contexte ORACLE, on peut aussi tout faire en un round-trip transactionnel via une procédure stockée…
    mais attention :
    la numérotation continue implémentée par un système centralisé a des conséquences opérationnelles dont il faut avoir conscience (réseau de points de facturation : ils deviennent dépendants de l'accessibilité au système centralisé… or, il est parfois nécessaire de garantir que l'on puisse facturer à tout moment, quitte à de voir le faire "off-line"…)


    Citation Envoyé par tchize_ Voir le message
    En tout cas, pour moi, la clé primaire devrait être distincte du numéro de facture. Un clé primaire est une donnée technique qui sert à relier des données entre-elles. Un numéro de facture est une donnée buisness qui ne devrait pas être soumises au contraintes de la techniques. (Autrement dit si demain ton client veux créer deux factures avec le même numéro, le logiciel devrait être facilement ajustable)
    Pas seulement "pour vous" : pour n'importe qui a une connaissance autre que théorique du monde de l'entreprise, et non seulement pour les raisons ici invoquées mais aussi :

    - même si la majorité des petites entreprises n'ont qu'un seul facturier de sortie, ce n'est pas une règle générale, et les séquences de numéro doivent être continues par facturier et non pas de manière globale;

    - la numérotation peut être soumise à des règles particulières, comme une assez commune : "continue par période fiscale avec remise à zéro lors du passage à la suivante" (le numéro est alors préfixé par l'année…), mais des plus exotiques existent;

    - …

    bref : autant de raisons qui vous appuient dans ce constat :
    un numéro de facture en particulier, et un numéro de document en général, doit être alloué de manière totalement indépendante de toute contrainte technique d'implémentation (et encore moins du RDBMS utilisé, cela va sans dire…) : ce genre de numérotation ne répond qu'à des règles business.
    L'idéal étant que ces règles puissent être configurées indépendamment de toute programmation "en dur".

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

Discussions similaires

  1. [AC-2003] Créer numéro de facture qui se suivent
    Par yieiyiei dans le forum VBA Access
    Réponses: 5
    Dernier message: 29/03/2015, 18h11
  2. [Tableaux] nombres qui se suivent
    Par djosh dans le forum Langage
    Réponses: 2
    Dernier message: 20/09/2006, 16h24
  3. [XSLT] Listes numérotées qui se suivent
    Par Mamath dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 18/07/2006, 11h46
  4. [Tableaux] Test qui se suivent
    Par tilou dans le forum Langage
    Réponses: 8
    Dernier message: 07/05/2006, 17h58
  5. [AWK] récupération de lignes qui se suivent
    Par PtiNico dans le forum Linux
    Réponses: 2
    Dernier message: 12/04/2005, 19h44

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