JPA Entity Manager - Как запустить файл сценария SQL?

У меня есть файл сценария SQL, который удаляет и воссоздает различные таблицы, а также вставляет различные записи в эти таблицы. Сценарий отлично работает при выполнении в консоли запросов SQL, однако мне нужно, чтобы он выполнялся диспетчером сущностей.

Есть идеи, как я смогу это сделать?

Спасибо,

H


person Harvey Sembhi    schedule 24.07.2014    source источник
comment
в чем твоя основная проблема? вы хотите запустить SQL Script File программно? Как EntityManager запустить SQL Script File?   -  person Zaw Than oo    schedule 25.07.2014
comment
Да, у меня есть файл .sql, содержащий множество SQL-запросов. Я хочу иметь возможность запускать этот файл программно.   -  person Harvey Sembhi    schedule 28.07.2014
comment
stackoverflow.com/ questions / 1044194 /   -  person Zaw Than oo    schedule 28.07.2014


Ответы (1)


Поздно на вечеринку, но вот как я это делаю. Здесь нужно отметить пару вещей:

  • Мой файл SQL ("sql-query.sql") находится в пути к классам - вы можете сделать это любым другим способом, который даст вам входной поток ...
  • В моем файле SQL по одному оператору на строку
  • Я вручную начинаю / фиксирую транзакции, по одной для каждой строки / оператора в файле

Вот способ выполнения файла:

void executeStatements(BufferedReader br, EntityManager entityManager) throws IOException {
    String line;
    while( (line = br.readLine()) != null )
    {
        entityManager.getTransaction().begin();
        entityManager.createNativeQuery(line).executeUpdate();
        entityManager.getTransaction().commit();
    }
}

Вот как я это называю:

        InputStream sqlFileInputStream = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("geo-data.sql");

        // Convert input stream to something that can be read line-by-line

        BufferedReader sqlFileBufferedReader = new BufferedReader( new InputStreamReader(sqlFileInputStream));
        executeStatements(sqlFileBufferedReader, dao.getEntityManager());

Я тестировал номинально с 1 транзакцией вместо 1 на оператор (обратите внимание, что это означает, что 1 неверный запрос сломает все), и время выполнения такое же:

void executeStatements(BufferedReader br, EntityManager entityManager) throws IOException {
    String line;
    entityManager.getTransaction().begin();
    while( (line = br.readLine()) != null )
    {
        entityManager.createNativeQuery(line).executeUpdate();
    }
    entityManager.getTransaction().commit();
}
person mikeb    schedule 10.08.2017