Bonjour à tous !
J'ai une relation many-to-many entre deux objets donc j'utilise une table intermédiaire pour enregistrer ce lien.
Pour expliquer rapidement je laisse la possibilité aux utilisateurs d'enregistrer le résultat d'une recherche multicritère sur les sociétés présentes dans le fichier.
Cela fait dont intervenir deux classes : MulticritSearch et Societe.
Quand j'enregistre une recherche multicritère dans la base de données je fais un enregistrement dans la table "multicritsearch" et 0 à plusieurs autres dans multicritsearch_societe.
Pour éviter tout problème je souhaite utiliser les transactions pour être certain que tout est bien rentré.
Sauf que de toute évidence je reste en autoCommit.
Voici ma méthode pour insérer une ligne dans "multicrit" :
Je m'étais demandé s'il était possible de récupérer l'id d'une enregistrement qui n'est pas vraiment enregistré (puisque validé avec un commit plus tard) mais j'arrive à en récupérer un.
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 public void insert(Connection con) throws SQLException { Timestamp ts = new Timestamp(creatime.getTime()); String query = "INSERT INTO multicritsearch (nom, type, creatime, id_user) VALUES (?, ?, ?, ?)"; PreparedStatement psInsert = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); psInsert.setString(1, nom); psInsert.setString(2, type); psInsert.setTimestamp(3, ts); psInsert.setLong(4, user.getId()); psInsert.executeUpdate(); ResultSet rsKeys = psInsert.getGeneratedKeys(); if(rsKeys.next()) { id = rsKeys.getInt(1); } }
Ensuite je boucle sur cette autre méthode qui ajoute des sociétés:
Le bout de code qui gère le tout :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public void addSociete(Connection con, Societe s) throws SQLException, PersistentException { if (id != null) { String query = "INSERT INTO multicrit_societe (id_multicrit, id_societe) VALUES (?, ?);"; PreparedStatement ps = con.prepareStatement(query); ps.setInt(1, id); ps.setInt(2, s.getId()); ps.executeUpdate(); societes.add(s); } else { throw new PersistentException("MulticritSearch has not been persisted"); } }
Pour tester j'ai viré le bout de code qui boucle sur l'enregistrement des sociétés et à la place j'ai fait un rollback.
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 Connection con = PoolManager.getConnection(); con.setAutoCommit(false); MulticritSearch ms = new MulticritSearch(); /* Construction de l'objet ... */ ms.insert(con); try { for (Societe s : lstSelected) { ms.addSociete(con, s); } con.commit(); } catch (SQLException e1) { e1.printStackTrace(); con.rollback(); } catch (PersistentException e1) { e1.printStackTrace(); con.rollback(); }finally{ con.close(); }
Je n'ai pas d'exception ni rien, mais mon enregistrement dans "multicritsearch" est toujours présent.
Y'a quelque chose que j'ai mal compris ou bien ça fonctionne pas super bien ?
Partager