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