Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    2

    forzare PK - getGeneratedKeys()

    Salve a tutti,
    sto giocano un po con java e in particolare su un progetto creato (da qualcun altro) a scopo didattico.

    mi sono imbattuto in un problema che non riesco a risolvere.

    sostanzialmente nell'insert viene inserita la pk = 0 recuperata dall'inserimento precedente (si è "perso" quella reale) e quindi quando esegue la query da errore di pk duplicata (anche se la 0 nel DB non c'è).

    la soluzione più semplice che mi è venuta in mente è quella di forzare la pk una volta per poi procedere normalmente, ma non riesco a capire come fare.
    PS: sono aperto a tutti i tipi di soluzione

    GRAZIE

    codice:
        public int insert(Film film) throws DAOException{
            String sql = "INSERT INTO FILM (TITOLO,ANNO,DURATA,GENERE,COSTO,IDREGISTA,POSTER,URL,INFO) "
                                  + " VALUES(?,?,?,?,?,?,?,?,?) ";
        
            try (PreparedStatement pst = con.prepareStatement(sql, new String[]{"IDFILM"});) {
                //sostituzione dei marcatori ?:
                pst.setString(1, film.getTitolo());
                pst.setShort(2, film.getAnno()==null ? null : film.getAnno() ); 
                pst.setShort (3, film.getDurata());
                pst.setString(4, film.getGenere()==null ? null : film.getGenere() );
                pst.setDouble(5, film.getCosto());
                pst.setInt   (6, film.getRegista().getIdregista());
                pst.setString(7, film.getPoster()); 
                pst.setString(8, film.getUrl());
                pst.setString(9, film.getInfo()==null ? null : film.getInfo() ); 
                
                System.out.println(film.toString());
                
               //Esegue la query preparata
                pst.executeUpdate(); 
                
                System.out.println("insert ok");
                
                //ottiene la PK generata da TRIGGER==>SEQUENCE
                res = pst.getGeneratedKeys(); 
                res.next();
    
                //contiene l'ultima PK generata
                return res.getInt(1);

  2. #2
    che database stai usando?
    Che tipo è questo campo di chiave primaria?
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    2
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    che database stai usando?
    Che tipo è questo campo di chiave primaria?
    ciao,
    sqldeveloper e il campo è un int

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Luigi? Visualizza il messaggio
    sqldeveloper e il campo è un int
    Visto che nel codice si parla di sequence, deduco che sia il IDE Oracle SQL Developer e quindi il DB Oracle.

    Vedo nel codice il commento //ottiene la PK generata da TRIGGER==>SEQUENCE

    Puoi precisare cosa fa esattamente? Non vorrei che con questo "giro" non sia possibile prendere il valore tramite la getGeneratedKeys(). Ma è solo una ipotesi, non ho esperienza in merito a questo metodo.
    Ultima modifica di andbin; 12-08-2016 a 23:16
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.