[英]Access to auto increment identity field after SQL insert in Java
關於如何通過java.sql.Statement.executeUpdate
調用分配給新創建的記錄的自動遞增標識字段的任何建議?
我知道如何在SQL中為幾個數據庫平台執行此操作,但是想知道java.sql
存在哪些數據庫獨立接口來執行此操作,以及人們在跨數據庫平台上使用此體驗的任何輸入。
以下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(...)
的參數是類似的。
ResultSet keys = statement.getGeneratedKeys();
稍后,只需迭代ResultSet。
我總是不得不在插入后使用查詢進行第二次調用。
您可以使用像hibernate這樣的ORM。 我認為它會為你做這些事情。
@ ScArcher2:我同意,Hibernate需要再次調用才能獲得新生成的標識,除非使用了高級生成器策略(sequence,hilo ...)
@ ScArcher2
第二次通話非常危險。 INSERT
和選擇生成的自動生成的密鑰的過程必須是原子的,否則您可能會在密鑰選擇上收到不一致的結果。 考慮兩個異步INSERT
,它們在有機會選擇生成的密鑰之前完成。 哪個進程獲取哪個鍵列表? 大多數跨數據庫ORM都必須執行諸如進程內線程鎖定之類的煩人事情,以保持結果的確定性。 這不是你想要手工完成的事情,特別是如果你使用的數據庫支持原子生成的密鑰檢索(HSQLDB是我所知道的唯一不支持的數據庫)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.