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:
Ma question est la suivante :
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
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); }
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 !!!!!!
Partager