Подтвердить что ты не робот

Доступ к автоматическому приращению идентификационного поля после вставки SQL в Java

Любые советы о том, как читать поле автоинкрементной идентификации, присвоенное вновь созданной записи, из вызова через java.sql.Statement.executeUpdate?

Я знаю, как это сделать в SQL для нескольких платформ БД, но хотел бы знать, какие независимые от базы данных интерфейсы существуют в java.sql, чтобы сделать это, и любой вклад, который люди испытывают с этим на платформах БД.

4b9b3361

Ответ 1

Следующий snibblet кода должен делать ya ':

PreparedStatement stmt = conn.prepareStatement(sql, 
                                 Statement.RETURN_GENERATED_KEYS);
// ...

ResultSet res = stmt.getGeneratedKeys();
while (res.next())
    System.out.println("Generated key: " + res.getInt(1));

Известно, что это работает в следующих базах данных

  • Derby
  • MySQL
  • SQL Server

Для баз данных, где он не работает (HSQLDB, Oracle, PostgreSQL и т.д.), вам нужно будет использовать трюки с конкретными базами данных. Например, на PostgreSQL вы сделали бы вызов SELECT NEXTVAL(...) для рассматриваемой последовательности.

Обратите внимание, что параметры для executeUpdate(...) аналогичны.

Ответ 2

ResultSet keys = statement.getGeneratedKeys();

Позже просто перейдем к ResultSet.

Ответ 3

Мне всегда приходилось делать второй вызов, используя запрос после вставки.

Вы можете использовать ORM как спящий режим. Я думаю, что он делает это для вас.

Ответ 4

@ScArcher2: Я согласен, Hibernate должен сделать второй вызов, чтобы получить вновь сгенерированный идентификатор, ЕСЛИ не используется расширенная стратегия генератора (последовательность, hilo...)

Ответ 5

@ScArcher2

Выполнение второго вызова крайне опасно. Процесс INSERT ввода и выбора результирующих автоматически сгенерированных ключей должен быть атомарным, иначе вы можете получить непоследовательные результаты при выборе ключа. Рассмотрим два асинхронных INSERT, где они оба завершатся, прежде чем у них будет возможность выбрать сгенерированные ключи. Какой процесс получает список ключей? Большинство ORM с несколькими базами данных должны делать раздражающие вещи, такие как блокирование потоков в процессе, чтобы результаты были детерминированными. Это не то, что вы хотите сделать вручную, особенно если вы используете базу данных, которая поддерживает поиск с помощью атомного ключа (только HSQLDB, о котором я знаю, не знает).