Получение идентификатора автоинкремента при вставке в SAP Hana - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть таблица со столбцом автоинкремента, как описано здесь

Вот как это определено в Java / Hibernate:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int ID;

И вот какстолбец определен в CREATE TABLE (примечание, без последовательности):

"ID" INTEGER CS_INT GENERATED BY DEFAULT AS IDENTITY

Теперь я хочу вставить строку в таблицу и получить полученный идентификатор.Проблема в том, что драйвер не поддерживает Statement.RETURN_GENERATED_KEYS для получения идентификатора с помощью оператора fetch.

С другой стороны, поскольку у меня нет созданной последовательности, я не могу использовать nextval.Любые идеи, как получить автоинкрементный идентификатор?

Примечание: JDBC имеет аналогичную проблему, это не характерно для Hibernate.

UPDATE

Пример кода (в Java / Hibernate):

        val c = new MyJpaClass
        c.code = 1
        c.name = "abc"
        c.version = 0
        entityManger.getTransaction.begin
        entityManger.persist(c)
        entityManger.getTransaction.commit

        // c.id should be populated here with the assigned autoincremented id

1 Ответ

0 голосов
/ 25 декабря 2018

Когда вы сохраняете сущность, Hibernate синхронизирует ее с базой данных, когда транзакция зафиксирована.Итак, вы можете просто сделать c.getId();

ОБНОВЛЕНИЕ Вот пример модульного теста.Все файлы здесь

import static org.junit.Assert.assertNotNull;

import java.io.FileNotFoundException;
import java.sql.SQLException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class PersistTest {
    Logger LOG = LogManager.getLogger(PersistTest.class);

protected static EntityManagerFactory emf;
protected static EntityManager em;

@BeforeClass
public static void init() throws FileNotFoundException, SQLException {
    emf = Persistence.createEntityManagerFactory("HelloWorldPU");
    em = emf.createEntityManager();
}

@AfterClass
public static void tearDown(){
    em.clear();
    em.close();
    emf.close();
}

@Test
public void testPersist_success() {
    em.getTransaction().begin();
    MyJpaClass o = new MyJpaClass();
    o.setMessage("text");
    em.persist(o);
    em.getTransaction().commit();

    assertNotNull(o.getId());
    LOG.debug(o.getId());
}

}

...