j'ai deux tables: étudiant et photo, la relation entre elles est de type fils-fils, alors j'ai la fonction d'insertion de la photo qui retourne la clé que je reçois dans la fonction d'insertion de l'étudiant (en paramètre), la clé de l'étudiant est lu depuis un texteField, alors il refuse de l'insérer, voilà l'exception:
"Cannot add or update a child row: a foreign key constraint fails (`brs`.`photo`, CONSTRAINT `FK_Photo_bac` FOREIGN KEY (`bac`) REFERENCES `etudiant` (`bac`))"
méthode d'insertion photo:
méthode d'insertion étudiant:
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 public int insertPhoto() throws Exception { String query = "INSERT INTO photo (image,bac)" + "VALUES (?,?)"; try (PreparedStatement stat = cnx.prepareStatement(query)) { // code_photo AUTO INCREMENT stat.setBinaryStream(1, fis); //la photo stat.setString(2, txtBAC.getText()); //la clé étraangère directement depuis le texteField stat.executeUpdate(); stat.close(); } String codeQuery = "SELECT MAX(code_photo) FROM photo"; try (PreparedStatement stat = cnx.prepareStatement(codeQuery)) { ResultSet rslt = stat.executeQuery(); rslt.next(); return rslt.getInt(1); } }
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 public void insertEtudiant(int codeLieu, int codeNat, String codeF, int codeMotif , int codePhoto) throws Exception { try { String etudiant = "INSERT INTO etudiant (bac,nom,prenom,genre,adresse,n_phone,mail,n_ccp,decision,bloque," + "n_ins,annee_encours,annee_univ,annee_courante,reste," + "an_1,an_2,an_3,an_4,an_5,an_6,an_7,an_8,an_9,an_10," + "cycle,code_f,date_nais,code,code_nat,Observation,date_bloc,code_motif) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; stat = cnx.prepareStatement(etudiant); stat.setString(1, txtBAC.getText()); //clé primaire stat.setString(2, txtNom.getText()); stat.setString(3, txtPrenom.getText()); // // stat.setInt(31, codePhoto); //clé étrangère // // stat.executeUpdate(); } finally { stat.close(); } }
le code d'appel:
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 btnSave.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { cnx.setAutoCommit(false); // int codePhoto = insertPhoto(); insertEtudiant(codeLieu, codeNat, codeF, codeMotif , codePhoto); // cnx.commit(); } catch (Exception e2) { try { cnx.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e2.printStackTrace(); } finally { try { cnx.setAutoCommit(true); } catch (SQLException e1) { e1.printStackTrace(); } } } });
Partager