有没有办法通过EclipseLink实体管理器创建数据库转储/备份? 我想在我的java(dropwizard)项目中添加一个功能,允许管理员下载当前数据库(也许可以导入一个新数据库)。 我正在使用H2数据库。
由于
答案 0 :(得分:0)
这对你来说相当容易,但我不认为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();
我不确切地知道你想做什么,但你可以:
我不认为您可以让h2db为您返回转储。但是我可能错了。
编辑:我错了
entityManager方法将返回包含整个SQL转储的结果列表。所以你在代码和文件中都有它(你可以删除你的文件)。
试一试,看看调试器吐出的内容。就像我说的,我没有使用EclipseLink,所以行为可能略有不同。
玩得开心,我希望能解决你的问题:)
Artur