Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/12/2011, 10h21   #1
Membre du Club
 
Développeur Java
Inscription : mai 2004
Messages : 155
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : mai 2004
Messages : 155
Points : 57
Points : 57
Envoyer un message via MSN à matech
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 ?
matech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 10h37   #2
Membre régulier
 
Inscription : février 2008
Messages : 84
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 84
Points : 91
Points : 91
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
Mon site www.outofcaffeineexception.org
MrCba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 10h55   #3
Membre du Club
 
Développeur Java
Inscription : mai 2004
Messages : 155
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : mai 2004
Messages : 155
Points : 57
Points : 57
Envoyer un message via MSN à matech
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.
matech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 11h02   #4
Membre chevronné
 
Inscription : février 2010
Messages : 580
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 580
Points : 727
Points : 727
La solution est de gérer toi même ta séquence, c'est un peu périeux, mais faisable.
Jimmy_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 11h23   #5
Expert Confirmé
 
Homme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 2 258
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 258
Points : 2 578
Points : 2 578
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.
DevServlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 12h58   #6
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 196
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 196
Points : 25 343
Points : 25 343
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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)
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 15/12/2011, 15h11   #7
Membre du Club
 
Développeur Java
Inscription : mai 2004
Messages : 155
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : mai 2004
Messages : 155
Points : 57
Points : 57
Envoyer un message via MSN à matech
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
matech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 21h46   #8
Expert Confirmé
 
Homme
Inscription : septembre 2006
Messages : 2 291
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : septembre 2006
Messages : 2 291
Points : 2 738
Points : 2 738
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".
JeitEmgie est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h13.


 
 
 
 
Partenaires

Hébergement Web