У меня есть файл сценария SQL, который удаляет и воссоздает различные таблицы, а также вставляет различные записи в эти таблицы. Сценарий отлично работает при выполнении в консоли запросов SQL, однако мне нужно, чтобы он выполнялся диспетчером сущностей.
Есть идеи, как я смогу это сделать?
Спасибо,
H
Ответ 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();
}