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 : 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);
}
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 !!!!!!