JPA实体管理器 - 如何运行SQL脚本文件?

时间:2014-07-24 14:46:57

标签: sql jpa entitymanager sql-scripts drop-table

我有一个SQL脚本文件,它删除并重新创建各种表,并在这些表中插入各种记录。在SQL查询控制台中执行时脚本运行正常,但我需要它由实体管理器执行。

我对如何做到这一点有什么想法?

谢谢,

ħ

1 个答案:

答案 0 :(得分:1)

晚会但是我的表现如何。这里需要注意几点:

  • 我的SQL文件(" sql-queries.sql")位于类路径上 - 您可以通过任何其他方式执行此操作来获取输入流...
  • 我的SQL文件每行有1条语句
  • 我手动开始/提交交易,一个用于文件中的每一行/语句

这是执行文件的方法:

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();
}