Доступ к автоматическому приращению поля идентичности после вставки SQL в Java - PullRequest
16 голосов
/ 16 сентября 2008

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

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

Ответы [ 5 ]

23 голосов
/ 17 сентября 2008

Следующий фрагмент кода должен сделать 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 голосов
/ 17 сентября 2008
ResultSet keys = statement.getGeneratedKeys();

Позже, просто переберите ResultSet.

0 голосов
/ 17 сентября 2008

@ ScArcher2

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 16 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...