2016-07-20 13 views
1

EclipseLinkエンティティマネージャを使用してデータベースダンプ/バックアップを作成する方法はありますか? 管理者が現在のデータベースをダウンロードして(おそらく新しいものをインポートする)ことを可能にするJava(dropwizard)プロジェクトに機能を追加したいと思います。 私はH2データベースを使用しています。しかし、私はどのようにうまくいかなかったのでI -EclipseLinkでデータベースバックアップ/ダンプを取得

おかげ

+0

興味深い問題を解決したいと考えています。私は可能であるかどうかはわかりませんが、誰かが解決策を持っているかどうかを教えてください。私は最も良いと思う "データベースからいくつかのアーカイブにすべてのエンティティをエクスポートする" –

+0

2.ほとんどのデータベース(しかし、すべてではない)SQLコマンドを介してバックアップすることができますので、JPA RAW SQLインターフェイスを介してコマンドを渡すことができます。これはJPAの定義とは関係ありません。 –

答えて

0

これがあなたのために非常に簡単ですが、しかし、私は

(これは100%真実ではないことはEntityManagerがするとは思いませんあなたはH2DBを持っている必要があり

、あなたのデータソースをバインドする(またはエンティティ・マネージャからの接続をアンラップする必要があります:あなたが同様にEMを使用することができまっすぐ代替)を提示しています

だから必需品)。その後、実行したいコマンドは次のとおりです。

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

ので、いくつかのポイント:

あなたがする必要はありませんデータソースに直接アクセスします。

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

Iドン簡単にGoogleは、EclipseLinkのは、あなたがこのようなあなたの接続にアクセスできるようになりますことを明らかにしました

  • ファイル名をリソースに渡すと、DBAはダンプの作成場所を知ることができますか?
  • 一時場所への書き込み、ダンプを読み、(ダウンロード用)ストリームを返す

私はあなたがh2dbがあなたのためにダンプを返すために得ることができるとは思いません。しかし、私は間違っているかもしれません。

編集:私は、EntityManagerのメソッドは、全体のSQLダンプと結果のリストを返します

間違っています。だからあなたはコードとファイル(あなたはあなたのファイルを削除することができます)でそれを持っています。

デバッガが吐き出すものを試してみてください。私が言ったように、私はEclipseLinkを使用していないので、動作が若干異なる場合があります。

は楽しいし、私は(少なくとも理論上のレベルでは)それはあなたの質問:)

アルトゥル

関連する問題