DAO méthode d'ajout: problème de contrainte [Résolu]

Signaler
Messages postés
33
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
1 mars 2021
-
Messages postés
33
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
1 mars 2021
-
Bonjour,

Je travaille sur une application web utilisant java ee et le patttern dao.
J'ai 2 table dans ma base de données:
Bookfile:


Book:


et j'essaye d'ajouter un "Book" qui lors de sa création créé un nombre donnée de "Bookfile" qui seront lié a celui-ci par un clé étrangère qui relie les 2 champ "idBook".

La clé étrangère et déjà créé mais celle ci créé un contrainte qui semble empêcher mes méthodes de fonctionner correctement.

Méthode d'ajout de Book:
@Override
    public void addNewBook(String isbn, String title, String author, String editor, String genre, String type, double refoundPrice, boolean ebook, String format,int nbr,int idLib) {
        Connection c = MySqlDaoFactory.getInstance().getConnection();
        
        PreparedStatement ps = null;
        
        String sql = "INSERT INTO book(isbn,title,author,editor,genre,type,refoundPrice,ebook,format) VALUES (?,?,?,?,?,?,?,?,?)";
        
        try{
        ps=c.prepareStatement(sql);
        ps.setString(1, isbn);
        ps.setString(2, title);
        ps.setString(3, author);
        ps.setString(4, editor);
        ps.setString(5, genre);
        ps.setString(6, type);
        ps.setDouble(7, refoundPrice);
        ps.setBoolean(8, ebook);
        ps.setString(9, format);
        ps.executeUpdate();
        BookFile bf = new BookFile();
        Book b = getLastBookEntry();
        int idBook = b.getIdBook()+1;
        for (int i = 0; i < nbr; i++) {
            bf.addNewBookFile(idLib,idBook);
        }
        ps.executeUpdate();
        
        } catch (SQLException ex) {
            Logger.getLogger(MySqlDaoBook.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally{
       
        MySqlDaoFactory.closeStatement(ps);
        MySqlDaoFactory.closeConnection(c);
        }
        
    }


Méthode d'ajout de BookFile :
@Override
    public void addNewBookFile(int idLibrary, int idBook) {
        Connection c = MySqlDaoFactory.getInstance().getConnection();
        
        PreparedStatement ps = null;
        
        String sql = "INSERT INTO bookfile(idLibrary,idBook) VALUES (?,?)";
        
        try{
        ps=c.prepareStatement(sql);
        ps.setInt(1, idLibrary);
        ps.setInt(2, idBook);
        ps.executeUpdate();
        
        
        } catch (SQLException ex) {
            Logger.getLogger(MySqlBookFileDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally{
       
        MySqlDaoFactory.closeStatement(ps);
        MySqlDaoFactory.closeConnection(c);
        }
    }


Et cela me renvoie le message d'erreur suivant:


Comment résoudre ce problème sans se contenté de supprimer la clé étrangère ?

3 réponses

Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
2 829
Bonjour,

Lorsque tu ajoutes un Bookfile il faut que l'idBook que tu passes en paramètre corresponde à un Book déjà inséré en base.

Tu devrais inverser ce morceau de code :
for (int i = 0; i < nbr; i++) {
    bf.addNewBookFile(idLib,idBook);
}
ps.executeUpdate();

Pour avoir l'ajout du Book d'abord :
ps.executeUpdate();
for (int i = 0; i < nbr; i++) {
    bf.addNewBookFile(idLib,idBook);
}
Messages postés
33
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
1 mars 2021

Merci de m'avoir répondu
J'ai modifié la méthode addNewBook mais malheureusement le problème reste le même :(

@Override
public void addNewBook(String isbn, String title, String author, String editor, String genre, String type, double refoundPrice, boolean ebook, String format,int nbr,int idLib) {
Connection c = MySqlDaoFactory.getInstance().getConnection();
PreparedStatement ps = null;

String sql = "INSERT INTO book(isbn,title,author,editor,genre,type,refoundPrice,ebook,format) VALUES (?,?,?,?,?,?,?,?,?)";

try{
ps=c.prepareStatement(sql);
ps.setString(1, isbn);
ps.setString(2, title);
ps.setString(3, author);
ps.setString(4, editor);
ps.setString(5, genre);
ps.setString(6, type);
ps.setDouble(7, refoundPrice);
ps.setBoolean(8, ebook);
ps.setString(9, format);
ps.executeUpdate();
BookFile bf = new BookFile();
Book b = getLastBookEntry();
int idBook = b.getIdBook()+1;
for (int i = 0; i < nbr; i++) {
bf.addNewBookFile(idLib,idBook);
}
} catch (SQLException ex) {
Logger.getLogger(MySqlDaoBook.class.getName()).log(Level.SEVERE, null, ex);
}
finally{
MySqlDaoFactory.closeStatement(ps);
MySqlDaoFactory.closeConnection(c);
}
}
Messages postés
16335
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 mai 2021
2 829
Lorsque tu ajoutes un Bookfile il faut que l'idBook que tu passes en paramètre corresponde à un Book déjà inséré en base.

Book b = getLastBookEntry();
int idBook = b.getIdBook()+1;


Pourquoi avoir ajouté +1 à l'idBook du dernier livre inséré ? Cela signifie que tu vas transmettre un id qui ne correspond à aucun livre...
Messages postés
33
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
1 mars 2021

Problème résolu !
Merci pour ton aide :)