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

Signaler
Messages postés
19
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
29 novembre 2020
-
Messages postés
19
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
29 novembre 2020
-
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
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 739
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
19
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
29 novembre 2020

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
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 739
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
19
Date d'inscription
lundi 20 février 2017
Statut
Membre
Dernière intervention
29 novembre 2020

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