Я получаю эту ошибку при выполнении команды сохранения вставки/обновления: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
Почему ваш оператор обновления задает идентификатор? Разве вы не должны устанавливать другие поля? Не уверен, что это проблема, но кажется странным. – rfeak
На самом деле, думая об этом немного больше, вы можете дважды проверить, что это не вызывает проблемы. БД - это не моя сила, но я вижу, что БД жалуется на попытку обновления первичного ключа, который уже существует. По крайней мере, устраните это как возможность. – rfeak
спасибо, что посмотрели. Я изменил его, что я определенно должен был сделать, но все равно получаю такую же ошибку. – novicePrgrmr