Já que está usando o Pool de conexões c3p0. Porque usar o try com recurso na hora de pegar um conexão? É necessário fechar a conexão?
public class TestaInsercaoComProduto {
public static void main(String[] args) throws SQLException {
Produto comoda = new Produto("Cômoda", "Cômoda Vertical");
try(Connection con = new ConnectionFactory().recuperarConexao()) {
String sql = "INSERT INTO produto(nome, descricao) VALUES (?, ?)";
try(PreparedStatement pstm = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)){
pstm.setString(1, comoda.getNome());
pstm.setString(2, comoda.getDescricao());
pstm.execute();
try (ResultSet rst = pstm.getGeneratedKeys()){
while(rst.next()) {
comoda.setId(rst.getInt(1));
}
}
}
}
System.out.println(comoda);
}
}