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

Har*_*bhi 5 sql jpa sql-scripts entitymanager drop-table

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

关于我如何能够做到这一点的任何想法?

谢谢,

H

mik*_*keb 2

参加聚会迟到了,但我是这样做的。这里需要注意几点:

  • 我的 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我是这样称呼它的:

        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());
Run Code Online (Sandbox Code Playgroud)

我名义上测试了 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();
}
Run Code Online (Sandbox Code Playgroud)