2014-02-17 22 views
9

我想在Hibernate中獲取上次插入的ID的ID。如何使用Hibernate獲取上次插入的ID

搜索後:

Long lastId = ((Long) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue(); 

但是,下面的代碼給了我這個錯誤:

java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long

請分享您的想法!

解決方案

Long lastId = ((BigInteger) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue(); 

不要忘了導入:

import java.math.BigInteger;

+0

介意分享你要這個ID怎麼辦?一旦你獲取lastID,它就已經過時;任何其他系統用戶/線程都可以在您的lastId變量所在的時間範圍內對其進行更新。 – Gimby

+0

我必須將該ID作爲外鍵標識存儲到另一個表中。這種情況有沒有更好的解決方案? –

+2

是的:正確使用JPA。當你插入一個實體時,ID將在持久化之後在對象實例中設置。從對象本身獲取ID以確保您獲得正確的ID。這是出於審計目的還是什麼? – Gimby

回答

10

錯誤是相當清楚的。它返回BigInteger而不是long

您必須將它分配給BigInteger。並從中獲得longValue()

+0

嘿蘇雷什,它的工作。謝謝。 –

+0

@MohitBhansali不客氣。請不要用答案編輯你的問題。標記正確的答案。 –

+0

顯然是的。但是stackoverflow規則,你不能在5分鐘內接受答案。所以只是在等待。 –

0

由於uniqueResult()返回類型是BigInteger而不是Long,你應該這樣做是這樣的:

long lastId = session.createSQLQuery("SELECT LAST_INSERT_ID()") 
        .uniqueResult() // this returns a BigInteger 
        .longValue(); // this will convert it to a long value 

的方法uniqueResult()只返回,因爲您的查詢SELECT LAST_INSERT_ID()的一個BigInteger。

4
public Integer save(Smartphones i) { 
    int id = 0; 
    Session session=HibernateUtil.getSessionFactory().openSession(); 
    Transaction trans=session.beginTransaction(); 
    try{ 
     session.save(i); 
     id=i.getId(); 
     trans.commit();  
    } 
    catch(HibernateException he){} 
    return id; 
} 
2

您可以簡單地使用保存它返回一個序列化對象,實際上是最後一個插入ID。 示例代碼:

Session session=this.getSessionFactory().getCurrentSession(); 
    int result = -1; 
    try { 
     Serializable ser = session.save(paper); 
     if (ser != null) { 
      result = (Integer) ser; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return result; 

一個測試運行:

int result = paperService.save(paper); 
    System.out.println("The id of the paper you just added is: "+result); 

這裏是輸出:

The id of the paper you just added is: 3032