2009-11-09 5 views
1

У меня есть таблица базы данных A, в которой хранятся записи, A имеет первичный ключ (recordid) с auto_increment, каждый раз, когда я вставляю запись в A, я получаю вставленную запись и сохраняю ее в другой masterTable.Получение последнего вставленного идентификатора записи таблицы базы данных в java?

Я использую оператор выбора, как только я сделать вставку в А, чтобы получить RecordId так:

выберите RecordID от A порядка по RecordId DESC LIMIT 1;

Но я столкнулся с проблемой на сегодняшний день, где в две записи были вставлены (разными потоками) в то же время и я в конечном итоге хранить неправильно RecordId в основной идентификатор (тот же RecordId для обоих txns)

Я слышал о Statement.getGeneratedKeys(), я хотел бы знать, действительно ли это помогает решить проблему. Или что это лучший способ справиться с этим.

ответ

8

Вы можете использовать метод getGeneratedKeys. Это поможет forum post.

Могу ли я также рекомендовать использовать инструмент ОРМ, например Hibernate. В Hibernate вы могли бы сделать что-то вроде этого:

myTable = new myTable(); 
myTable.prop1 = prop1; 
myTable.prop2 = prop2; 
int id = session.save(myTable); 

Hibernate будет выдавать соответствующие команды SQL (в зависимости от выбранной базы данных) и вернуть вам автоматически сгенерированный идентификатор.

+0

Если драйвер JDBC MySQL реализует его. –

+0

Это правда. Если драйвер JDBC не поддерживает его, для получения идентификатора вам необходимо использовать методы, специфичные для базы данных. – kgiannakakis

+0

@kgiannakakis - 'session.save (myTable)' не возвращает 'int'. Однако он возвращает 'java.io.serializable', а метод getGeneratedKeys()' не поддерживается какой-либо реализацией драйверов JDBC до сих пор. Поэтому ни один из двух случаев, которые вы упомянули, не будет успешным, как очевидный. Действительно ли они работают? – Lion

3

Драйвер JDBC MySQL поддерживает метод getGeneratedKey(). Посмотрите раздел 20.3.5.1.4. Retrieving AUTO_INCREMENT Column Values руководства MySQL, где:

мы демонстрирующая использование нового метода getGeneratedKeys() JDBC-3.0, который в настоящее время является предпочтительным способом использовать, если вам нужно получить ключи AUTO_INCREMENT.

1

В базах данных, которые не поддерживают сгенерированныеKeys, вы можете получить идентификатор в возвращаемом параметре. Oracle, например, предоставляет RETURNING xxx INTO? синтаксис, где xxx - ваше имя столбца.

Смежные вопросы