2014-11-05 3 views
1

MSSQL (2008) и EclipseLink (2,4)EclipseLink запись вставка возвращает неверный идентификатор

Я вставки в таблицу с триггером, который делает вставки в другую таблицу

Когда это происходит EclipseLink возвращает идентификатор записи, вставленной в другую таблицу с помощью триггера.

Я предполагаю, что могу получить правильный идентификатор, получив EcliipseLink для использования SCOPE_IDENTITY() вместо @@ IDENTITY.

Вопрос в том, как это сделать?

Мне нужно решение для EclipseLink (JPA), я знаю, как получить идентификатор, используя sql.

+0

После того как вы '' Insert' Выберите @IDImAfter = SCOPE_IDENTITY() ' Вернет идентификатор из таблицы, в которую вы вставляете, а не в таблицу, в которую вставляется триггер. – Fred

+0

Я отредактировал мой вопрос, чтобы уточнить, что мне нужно решение для EclipseLink. Мне хорошо известно, что SCOPE_IDENTITY() вернет id - проблема в том, чтобы заставить EclipseLink сделать это. –

ответ

0

TableA имеет триггер, который вставляется в другой стол. Вы даете команду как ..

INSERT INTO TableA (Field1, Field2) VALUES (@Value1, @Value2); SELECT SCOPE_IDENTITY() As MyRecID

Это будет вставить запись в TableA и вернуть ID этой записи.

Для получения дополнительной информации читайте SCOPE_IDENTITY (Transact-SQL)

+0

Я отредактировал мой вопрос, чтобы уточнить, что мне нужно решение для EclipseLink. Мне хорошо известно, что SCOPE_IDENTITY() вернет id - проблема в том, чтобы заставить EclipseLink сделать это. –

0

Существует пример добавления пользовательского объекта последовательности в EclipseLink, чтобы решить этот вопрос здесь: http://helpdesk.ibs-aachen.de/2009/08/27/eclipselink-ms-sql-server-identity/

+1

К сожалению, этот пример очень устарел. он также использует IDENT_CURRENT, который вернет последний идентификатор любой вставки из любого соединения для таблицы. Он не может быть просто переключен на SCOPE_IDENTITY, поскольку кажется, что EclipseLink объединяет соединения и вызывает SCOPE_IDENTITY на другом соединении, возвращает null! –

+0

Установлен ли флаг ShouldAcquireValueAfterInsert равным true в вашей последовательности? Еще одна альтернатива - это подкласс SQLServerPlatform и переопределить метод buildSelectQueryForIdentity для возврата собственного запроса. Затем это добавляется в блок персистентности, используя http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_target_database.htm – Chris

+0

Я подклассифицировал SQLServerPlatform для использования scope_identity(), и он по-прежнему возвращает null. Затем я попытался использовать scope_identity напрямую через JDBC, и он по-прежнему возвращает null! Единственный способ получить идентификатор через JDBC - использовать getGeneratedKeys в объекте оператора, который я использовал для выполнения запроса. –

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