java.sql.SQLIntegrityConstraintViolationException

时间:2011-02-08 02:10:54

标签: java sql derby

运行save insert / update命令时出现此错误:

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);
        }
    }

yetInDB的代码:

/** 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

2 个答案:

答案 0 :(得分:3)

此语句emp.isObjectAlreadyInDB()显然失败并且一直返回false,导致每次运行代码时都插入相同的员工,从而违反了您在此设置的主键或唯一约束数据库表。

答案 1 :(得分:2)

我正在使用测试人员类,我不小心创建了一个与已经在数据库中的对象具有相同ID的对象。