2014-11-05 33 views
1

MSSQL(2008年)和的EclipseLink(2.4)的EclipseLink記錄插入返回錯誤ID

我插入到表與觸發器,它不插入到另一個表

當這種情況發生的EclipseLink返回ID通過觸發器插入另一個表中的記錄。

我假設我可以通過讓EcliipseLink使用SCOPE_IDENTITY()而不是@@ IDENTITY來獲得正確的ID。

問題是如何做到這一點?

我需要EclipseLink(JPA)的解決方案,我知道如何使用sql獲取id。

+0

你'Insert'後'選擇@IDImAfter = SCOPE_IDENTITY()'將從您插入的表格中返回ID,而不是觸發器插入的表格。 – Fred 2014-11-05 21:23:10

+0

我編輯了我的問題,使其更清晰,我需要EclipseLink的解決方案。我很清楚SCOPE_IDENTITY()會返回id - 問題是讓EclipseLink來完成它。 – 2014-11-05 23:52:27

回答

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來完成它。 – 2014-11-05 23:52:56

0

有添加自定義序列對象的EclipseLink解決這裏這個問題的一個例子:http://helpdesk.ibs-aachen.de/2009/08/27/eclipselink-ms-sql-server-identity/

+1

不幸的是,這個例子已經過時了。它也使用IDENT_CURRENT,它將返回表中任何連接的任何插入的最後一個ID。它不能簡單地切換到SCOPE_IDENTITY,因爲看起來EclipseLink正在彙集連接並在另一個連接上調用SCOPE_IDENTITY返回null! – 2014-11-06 23:56:58

+0

ShouldAcquireValueAfterInsert標誌在序列上是否設置爲true?另一種替代方法是對SQLServerPlatform和overrid buildSelectQueryForIdentity方法進行子類化以返回您自己的查詢。然後使用http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_target_database.htm – Chris 2014-11-07 15:39:51

+0

將其添加到持久性單元中。我將SQLServerPlatform的子類化爲使用scope_identity(),並且它仍然返回null。然後我直接通過JDBC嘗試使用scope_identity,它仍然返回null!我可以通過JDBC獲取id的唯一方法是在我用來執行查詢的語句對象上使用getGeneratedKeys。 – 2014-11-11 03:00:34