Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Harvey SembhiОтветов: 1

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

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

Спасибо,

H

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

sqljpasql-scriptsentitymanagerdrop-table

Ответы

Ответ 1 · рейтинг 2 · mikeb

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

  • Мой файл 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();
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы