DAO méthode d'ajout: problème de contrainte

Résolu
Rune188 Messages postés 81 Statut Membre -  
Rune188 Messages postés 81 Statut Membre -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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);
    }
    1
  2. Rune188 Messages postés 81 Statut Membre
     
    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);
    }
    }
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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...
      0
  3. Rune188 Messages postés 81 Statut Membre
     
    Problème résolu !
    Merci pour ton aide :)
    0