【问题标题】:How can I get last inserted id using Hibernate如何使用 Hibernate 获取最后插入的 id
【发布时间】:2014-02-17 12:23:01
【问题描述】:

我想在 Hibernate 中获取最后插入的值的 id。

搜索后:

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

但是下面的代码给了我这个错误:

java.lang.ClassCastException: java.math.BigInteger 无法转换为 java.lang.Long

请分享你的想法!

解决方案

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

别忘了导入:

导入 java.math.BigInteger;

【问题讨论】:

  • 介意分享一下你打算用这个ID做什么?一旦您获取 lastID,它就已经过时了;任何其他系统用户/线程都可以在您的 lastId 变量在范围内的时间范围内对其进行更新。
  • 我必须将该 id 作为外键 id 存储到另一个表中。这种情况有没有更好的解决办法?
  • 是:正确使用 JPA。当您插入实体时,ID 将在持久化后在对象实例中设置。从对象本身获取 ID 以确保您获得正确的 ID。这是出于审计目的还是什么?
  • 呃,我假设是 JPA,但如果您直接使用 Hibernate API,也是如此。
  • @ALL: 使用这个stackoverflow.com/questions/25561681/…很容易获得最后插入的 ID

标签: java mysql hibernate struts2


【解决方案1】:

错误很明显。它返回 BigInteger 而不是 long

您必须将其分配给BigInteger。并从中获取longValue()

【讨论】:

  • @MohitBhansali 欢迎您。请不要用答案编辑您的问题。标记正确答案。
  • 显然是的。但是stackoverflow规定,5分钟内不能接受答案。所以只能等待。
【解决方案2】:
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;
}

【讨论】:

    【解决方案3】:

    您可以简单地使用 save 来返回一个 Serializable 对象,该对象实际上是最后一个插入 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
    

    【讨论】:

      【解决方案4】:

      由于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
      

      由于您的查询SELECT LAST_INSERT_ID(),方法uniqueResult() 只返回一个BigInteger。

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 2016-08-15
        • 1970-01-01
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        相关资源
        最近更新 更多