2015-09-28 2 views
0

Как я могу вернуть автоматически генерируемый идентификатор только что вставленной строки, используя собственный метод sql и value object (без сохранения/обновления и т. Д.). Идентификаторы (поля идентификации) обрабатываются сервером базы данных.Hibernate custom sql для получения последнего идентификатора вставки

Java код DatabaseObject.java

public int insert(String sql, Object valueObject) throws Exception { 
    Session session = Entitlement.getSessionFactory().openSession(); 
    session.beginTransaction(); 
    int result = session.createSQLQuery(sql) 
      .setProperties(valueObject).executeUpdate(); 
    session.getTransaction().commit(); 
    session.close(); 
    return result; 
} 

Использование DatabaseObject

String sql = "INSERT INTO user(emailAddress, password) VALUES(:emailAddress, :password)"; 
UserVO valueObject = new UserVO("[email protected]", "pass1234"); 
databaseObject.insert(sql, valueObject); 

ответ

1
public BigInteger insert(String sql, Object valueObject) throws Exception 
{ 
    Session session = Entitlement.getSessionFactory().openSession(); 
    Transaction txn = session.beginTransaction(); 

    session.createSQLQuery(sql) 
      .setProperties(valueObject) 
      .executeUpdate(); 

    BigInteger result = session.createSQLQuery("SELECT LAST_INSERT_ID()") 
           .uniqueResult(); 

    txn.commit(); 
    session.close(); 

    return result; 
} 
+0

благодаря @eggyal. Как бороться с проблемой параллелизма в этом примере, если у вас несколько сотен потоков, выполняющих ту же функцию – user2727195

+0

@ user2727195: 'LAST_INSERT_ID()' поддерживается * для подключения к базе данных *. – eggyal

+0

ОК, я понимаю сейчас. Кроме того, мы обнаружили, что 'LAST_INSERT_ID()' является специальной функцией сеанса пользователя, протестированной с помощью фиктивной вставки в workbench mysql, и оба значения различны. – user2727195

Смежные вопросы