2014-02-17 3 views
9

Я хочу получить идентификатор последнего вставленного значения в Hibernate.Как я могу получить последний вставленный идентификатор, используя Hibernate

После поиска:

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 находится в области видимости. – Gimby

+0

Мне нужно сохранить этот идентификатор в другую таблицу как идентификатор внешнего ключа. Есть ли лучшее решение для этой ситуации? –

+2

Да: используйте JPA правильно. Когда вы вставляете объект, идентификатор будет установлен в экземпляре объекта после его сохранения. Получите идентификатор от самого объекта, чтобы убедиться, что вы получили правильный идентификатор. Это для целей аудита или что-то еще? – 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() возвращает только BigInteger из вашего запроса SELECT LAST_INSERT_ID().

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

Вы можете просто использовать save, который возвращает объект Serializable, который фактически является последним идентификатором вставки. Пример кода:

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 
Смежные вопросы