Problema em inserir após erro

Meu programa Java + HSQLDB possui um método para inserir um novo registro no BD. Esse método é chamado toda vez que há um clique no menu ou botão inserir. Quanto tento inserir um valor para uma chave primária já existente no BD, ocorre obviamente um erro.

Mas o problema consiste no fato de que após a mensagem de erro ser exibida ao usuário, o certo seria o usuário poder inserir novamente um registro após clicar no menu ou botão inserir, e isso não acontece!
O sistema permite inserir registros, desde que não ocorra nenhum erro.
Porém, se alguma coisa sai errada (como o exemplo da chave primária), não se consegue inserir mais nada no BD.

Como resolver? Já me sugeriram colocar um rollback() após o erro, mas não adiantou.

Espero ter explicado bem minha dúvida.

O método para inserir:

public void adicionarRegistro() {
      Connection connection;   
      try { 
         String driver = "org.hsqldb.jdbcDriver"; 
         String url = "jdbc:hsqldb:file:./db/database"; 
         String userId = "sa"; 
         String password = ""; 
         String sqlInsert = "INSERT INTO CLIENTES VALUES (?, ?, ?)"; 
         Class.forName(driver); 
         connection = DriverManager.getConnection(url, userId, password); 
         String id = JOptionPane.showInputDialog(null, "Digite a ID do cliente:", "ID", 3); 
         String nome = JOptionPane.showInputDialog(null, "Digite o NOME do cliente:", "NOME", 3); 
         String fone = JOptionPane.showInputDialog(null, "Digite o TELEFONE do cliente:", "TELEFONE", 3); 
         int idInt = Integer.parseInt(id); 
         String nomeString = nome.toUpperCase(); 
         int foneInt = Integer.parseInt(fone); 
         PreparedStatement pstm = connection.prepareStatement(sqlInsert); 
         pstm.setInt(1, idInt); 
         pstm.setString(2, nomeString); 
         pstm.setInt(3, foneInt); 
         int inseriu = pstm.executeUpdate();
         if(inseriu != 1) { 
            JOptionPane.showMessageDialog(null, "Não foi possível inserir o registro! Verifique os valores inseridos.", "Resultado da inserção do registro", 3);  
         } 
         else { 
            connection.commit();
            modeloTabela.addRow(new Object[] { idInt, nomeString, foneInt } ); 
            JOptionPane.showMessageDialog(null, "Registro inserido com sucesso!", "Resultado da inserção do registro", 1);    
         }
         pstm.close(); 
         connection.close();
      }   // Fim try { 
      catch(ClassNotFoundException cnfe) { 
         cnfe.printStackTrace(); 
         System.out.println(cnfe.toString()); 
      } 
      catch(SQLException sqle) { 
         sqle.printStackTrace();  
         System.out.println(sqle.toString()); 
         JOptionPane.showMessageDialog(null, "Não foi possível inserir o registro! Verifique os valores inseridos.", "Resultado da inserção do registro", 3);  
         connection.rollback();
      }
   }

tente fechar a conexão tbm nos catch…
connection.close();

      catch(ClassNotFoundException cnfe) {
         cnfe.printStackTrace();
         System.out.println(cnfe.toString());
         connection.close();
      }
      catch(SQLException sqle) {
         sqle.printStackTrace(); 
         System.out.println(sqle.toString());
         JOptionPane.showMessageDialog(null, "Não foi possível inserir o registro! Verifique os valores inseridos.", "Resultado da inserção do registro", 3); 
         connection.rollback();
         connection.close();
      } 

ou até, melhor, no finally:

         (...)
      }
      catch(ClassNotFoundException cnfe) {
         cnfe.printStackTrace();
         System.out.println(cnfe.toString());
      }
      catch(SQLException sqle) {
         sqle.printStackTrace(); 
         System.out.println(sqle.toString());
         JOptionPane.showMessageDialog(null, "Não foi possível inserir o registro! Verifique os valores inseridos.", "Resultado da inserção do registro", 3); 
         connection.rollback();
      } finally {
         pstm.close();
         connection.close();
      }

Não sei, acho que o problema não está em fechar a conexão. Porque eu fecho a conexão tendo uma operação concluída com sucesso ou não.
Enfim, espero qualquer sugestão.