Доступ к автоматическому приращению идентификационного поля после вставки SQL в Java
Любые советы о том, как читать поле автоинкрементной идентификации, присвоенное вновь созданной записи, из вызова через java.sql.Statement.executeUpdate
?
Я знаю, как это сделать в SQL для нескольких платформ БД, но хотел бы знать, какие независимые от базы данных интерфейсы существуют в java.sql
, чтобы сделать это, и любой вклад, который люди испытывают с этим на платформах БД.
Ответы
Ответ 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));
Известно, что это работает в следующих базах данных
Для баз данных, где он не работает (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, о котором я знаю, не знает).