这对你来说相当容易,但我认为 EntityManager 不会这样做
(这不是 100% 正确的 - 但我无法弄清楚如何,所以我向您展示了您也可以与 EM 一起使用的直接替代方案)
所以先决条件:
您需要拥有 H2DB 并且需要绑定数据源(或从实体管理器解包连接)。那么你要运行的命令是:
SCRIPT TO '/path/to/my/file'
例如,我是这样实现的:
@Inject
private DataSource ds;
@GET
@Path("dump")
public Response dump() {
try (Connection c = ds.getConnection(); Statement s = c.createStatement()) {
s.execute("SCRIPT TO '/home/artur/tmp/test/test.sql'");
} catch (SQLException e) {
e.printStackTrace();
}
return Response.ok().build();
}
所以,有几点:
您不需要直接访问数据源。一个快速的谷歌透露,eclipselink 会让你像这样访问你的连接:
entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class);
...
entityManager.getTransaction().commit();
或者,这也可以工作(并且不使用任何连接/jdbc 属性):
emp.get().createNativeQuery("SCRIPT TO '/home/artur/tmp/test/test.sql'").getResultList();
我不知道你想做什么,但你可以:
- 将文件名传递到资源中,以便您的 DBA 知道转储的创建位置?
- 写入临时位置,读取转储并返回流(用于下载)
我认为您不能让 h2db 为您返回转储。不过我可能是错的。
编辑:我错了
entityManager 方法将返回一个包含整个 SQL 转储的结果列表。所以你在代码和文件中都有它(你可以删除你的文件)。
试一试,看看调试器会吐出什么。就像我说的,我没有使用 EclipseLink,所以行为可能会略有不同。
玩得开心,我希望能解决你的问题:)
阿图尔