Автогенерация ID для объекта
На уровне БД задаю IDENTITY(1,1)
@Override
public void createTable() throws SQLException {
super.executeSQL(
"CREATE TABLE IF NOT EXISTS pupils(" +
"id BIGINT IDENTITY(1,1) PRIMARY KEY," +
"name NVARCHAR(255) NOT NULL," +
"surname NVARCHAR(255) NOT NULL," +
"CONSTRAINT uc UNIQUE (id,name,surname))",
"Создана таблица " + tableName);
}
Делаю INSERT в базу
@Override
public Pupil save(Pupil obj) throws SQLException {
try(PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO pupils VALUES (?,?,?)")) {
preparedStatement.setLong(1,obj.getId());
preparedStatement.setString(2,obj.getName());
preparedStatement.setString(3,obj.getSurname());
preparedStatement.executeUpdate();
System.out.println("Запись добавлена" + " " + obj.getId() + " " + obj.getName() + " " + obj.getSurname());
}
return obj;
}
При выводе в консоль он пишет
Запись добавлена 0 Oleg Davidow
При добавлении следующей записи выкидиывает ошибку SQL, подразумеваю, что пытается добавить запись с таким же id. В чем может быть проблема?
Ответы (2 шт):
Автор решения: Aziz Umarov
→ Ссылка
Так попробуйте
public Pupil save(Pupil obj) throws SQLException {
try(PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO pupils (name, surname) VALUES (?,?)")) {
preparedStatement.setString(1,obj.getName());
preparedStatement.setString(2,obj.getSurname());
preparedStatement.executeUpdate();
try (ResultSet generatedKeys = preparedStatement.getGeneratedKeys()) {
if (generatedKeys.next()) {
obj.setId(generatedKeys.getLong(1));
}
else {
throw new SQLException("Creating user failed.");
}
}
System.out.println("Запись добавлена" + " " + obj.getId() + " " + obj.getName() + " " + obj.getSurname());
}
return obj;
}
Автор решения: AlekseiGaile
→ Ссылка
@Override
public void createTable() throws SQLException {
super.executeSQL(
"CREATE TABLE IF NOT EXISTS pupils(" +
"id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY," +
"name NVARCHAR(255) NOT NULL," +
"surname NVARCHAR(255) NOT NULL," +
"CONSTRAINT uc UNIQUE (id,name,surname))",
"Создана таблица " + tableName);
}
вы не должны сами задавать значения id для таблиц, соответственно - preparedStatement.setLong(1,obj.getId()); - надо удалить.