Select max id avant insertion (pb insertion parallèles)
Bonjour,
Je débute sur hibernate et en java de manière générale.
Je dois réaliser de multiples insertions en base de donnees et sur certaines tables je dois calculer le MAX (id) via un select pour ensuite faire l'insertion en mettant l'id ==> MAX(id)+1.
Le but est de realiser toute mes operation en base puis ensuite de faire le commit. Ainsi, si une insertion echoue (pour une raison X ou Y), je fais un rollback et aucune des précédentes insertions n'est commitée.
En gros ca donne ça:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
HibernateTransaction transaction = new HibernateTransaction();
try
{
transaction.begin();
//recuperation dune liste de clients contenant chacun une liste de contrats
List lesClient = getClient();
Iterator it = lesClient.iterator()
while(it.hasnext())
{
Client leClient = (Client) it.next;
//recuperation du MAX ID CLIENT
int idClient = FonctionHibernate.getMaxID()
//creation de mon objet client mappant la table en BDD
ClientMappingBDD cltBdd = new ClientMappingBDD();
//set ID
cltBdd.setID=idCLient+1;
//set nom
cltBdd.setNom=leClient.getNom();
//appel de la fonction realisant l'insertion de mon client en BDD
FonctionHibernate.insertClient(cltBdd)
//boucle sur mes contrats
Iterator itContrat= leClient.getLesContrats().iterator()
while(itContrat.hasnext())
{
Contrat leContrat = (Contrat) it.next();
//instanciation d'un objet mappant la table CONTRAT
ContratMappingBDD cntBdd= new ContratMappingBDD();
//remplissage de l objet
cntBdd.setNumContrat(leContrat.getNoCnt());
cntBdd.setIdClient(idCLient+1);
//appel de la fonction d insertion de Contrat
FonctionHibernate.insertContrat(cntBdd);
}
}
transaction.commit();
}
catch(Throwable e)
{
try
{
transaction.rollback();
e.printStackTrace();
return false;
}
catch (Exception ex)
{
logger.info("rollback transaction error");
}
throw new Exception(e);
} |
Ma question est la suivante :
Si, entre le moment de la selection de mon max id client et l'insertion de mon client, qquun d'autre insert un client, vais je me retrouver avec le mauvais id_clt dans ma table CONTRAT au moment de l'insertion de mon contrat?
Si oui, avez vous une idee de comment faire pour ne pas m'exposer a ce probleme ?
ps: jai donne un sample de code pour lexemple mais le mien est plus complique.. je nai pas utiliser les relation one to many et many to one, chacune des tables que je rempli est mappée par un hbm.xml et son objet associe... je prefererai eviter dutiliser les relation un a plusieurs et garder mon mapping tel quel
Merci d'avance pour vos reponses !!!!!!