2011-02-08 2 views
1

Я получаю эту ошибку при выполнении команды сохранения вставки/обновления:java.sql.SQLIntegrityConstraintViolationException

SEVERE: null 
java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL110207185137350' defined on 'EMPLOYEE'. 
null, Boris Wilkins 

Если кто-нибудь может определить, почему эта ошибка происходит, было бы здорово.

вот код:

///////////////////////////////////////////// 
    /// UPDATE methods 
    /** Saves an existing pkg in the database */ 
    public void save(Employee pkg) throws DataException { 
     Connection conn = null; 
     try { 
      conn = ConnectionPool.getInstance().get(); 
      save(pkg, conn); 
      conn.commit(); 

     } catch (Exception e) { 
      try { 
       conn.rollback(); 
      } catch (SQLException ex) { 
       throw new DataException("We're currently upgrading our site to serve you better.", e); 
      } 
      throw new DataException("Problem saving the Employee", e); 

     } finally { 
      ConnectionPool.getInstance().release(conn); 

     }//update 
    } 

    /** Internal method to update a pkg in the database */ 
    void save(Employee emp, Connection conn) { 
     // update the cache 
     Cache.getInstance().put(emp.getId(), emp); 
     // if not dirty, return 
     if (!emp.isDirty()) { 
      return; 
     } 
     // call either update() or insert() 
     if (emp.isObjectAlreadyInDB()) { 
      update(emp, conn); 
     } else { 
      insert(emp, conn); 
     } 

    }//save 

    /** Saves an existing pkg to the database */ 



    //NEED HELP WITH EXECUTE STATEMENT!!! 


    private void update(Employee pkg, Connection conn) { 
     try { 
      // run the update SQL 
      PreparedStatement pstmt = conn.prepareStatement("UPDATE Employee SET id=?, name1=?, username1=?, password=?, type=? WHERE id=?"); 
      pstmt.setString(1, pkg.getId()); 
      pstmt.setString(2, pkg.getName1()); 
      pstmt.setString(3, pkg.getUserName1()); 
      pstmt.setString(4, pkg.getPassword()); 
      pstmt.setString(5, pkg.getType()); 
      pstmt.setString(6, pkg.getId()); 

      pstmt.executeUpdate(); 
      pstmt.close(); 
      // update the dirty variable 
      pkg.setDirty(false); 
     } catch (SQLException ex) { 
      Logger.getLogger(EmployeeDAO.class.getName()).log(Level.SEVERE, null, ex); 
     } 


    } 

    /** Inserts a new pkg into the database */ 
    private void insert(Employee pkg, Connection conn) { 
     try { 
      // run the insert SQL 
      PreparedStatement pstmt = conn.prepareStatement("INSERT into Employee (id, name1, username1, password, type) values(?, ?, ?, ?, ?)"); 
      pstmt.setString(1, pkg.getId()); 
      pstmt.setString(2, pkg.getName1()); 
      pstmt.setString(3, pkg.getUserName1()); 
      pstmt.setString(4, pkg.getPassword()); 
      pstmt.setString(5, pkg.getType()); 
      // update the dirty variable 

      pstmt.execute(); 
      pstmt.close(); 
      pkg.setDirty(false); 
     } catch (SQLException ex) { 
      Logger.getLogger(EmployeeDAO.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Код для alreadyInDB:

/** Returns whether the object is in the DB or not */ 
    boolean isObjectAlreadyInDB() { 
    return objectAlreadyInDB; 
    }//isObjectAlreadyInDB 

    /** 
    * Sets whether the object is already in the DB. This method 
    * is called ONLY from the DAO responsible for this object. 
    */ 
    void setObjectAlreadyInDB(boolean objectAlreadyInDB) { 
    this.objectAlreadyInDB = objectAlreadyInDB; 
    }//setObjectAlreadyInDB 
+0

Почему ваш оператор обновления задает идентификатор? Разве вы не должны устанавливать другие поля? Не уверен, что это проблема, но кажется странным. – rfeak

+1

На самом деле, думая об этом немного больше, вы можете дважды проверить, что это не вызывает проблемы. БД - это не моя сила, но я вижу, что БД жалуется на попытку обновления первичного ключа, который уже существует. По крайней мере, устраните это как возможность. – rfeak

+0

спасибо, что посмотрели. Я изменил его, что я определенно должен был сделать, но все равно получаю такую ​​же ошибку. – novicePrgrmr

ответ

3

Это утверждение emp.isObjectAlreadyInDB() явно неудача и возвращение false всего времени, в результате чего один и тот же сотрудника должен быть вставлен каждый раз, когда вы запускаете кода, тем самым нарушив первичный ключ или уникальное ограничение, настроенное в этой таблице базы данных.

2

Я узнал, почему мой код так плохо прикручивается.

Я использую класс тестера, и я случайно создал объект с тем же идентификатором, что и объект, который уже был в БД.

Спасибо за помощь, ребята!

Смежные вопросы