Автогенерация 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()); - надо удалить.

→ Ссылка