2011-07-21 5 views
2

私は4つの文字列値を格納するためにGoogle App Engineデータストアを使用しています。文字列vlauesは、サーブレットでデータストアに追加されます。Google App Engineデータストアエンティティが削除されない

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 

     Entity balances; 
     Key primaryKey; 
     String table = "MainTable"; 
     String name = "Values"; 

     primaryKey = KeyFactory.createKey(table, name); 

     Transaction t = datastore.beginTransaction(); 
      // If the 'table' exists - delete it 
     datastore.delete(primaryKey); 
      // Really make sure it's deleted/ 
     t.commit(); 

     t = datastore.beginTransaction(); 

      balances = new Entity("Balances", primaryKey); 
     updateBalances(balances); 
     datastore.put(balances); 

      // Save the new data 
     t.commit(); 
     resp.sendRedirect("/balance.jsp"); 

は、私は4つの文字列値サーブレットが実行されるたびに更新できるようにしたい - 私はキーの最初を探し、それを削除する理由です。私は、これが本当に起こることを確実にするために、別々のトランザクションを使用します。

キーが見つかって削除され、値が追加されます。しかし、値を取得する.jspファイルをロードすると、Entity内のレコードの数は毎回1ずつ増えます。なぜレコードが削除されていないのかわかりません。私はこの問題は、元の質問のコードでいたかわからない

<% 
     DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 

     Key guestbookKey = KeyFactory.createKey("MainTable", "Values"); 

     Query query = new Query("Balances", guestbookKey); 

     List<Entity> greetings = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(5)); 
    %> 
<!-- This should always be 1, but it gorws each time the servlet is hit.--> 
    <%= greetings.size() %> 

SOLUTION

:ここ

はの.jspコードです。しかし、Objectify(http://code.google.com/p/objectify-appengine/)というライブラリを使用することで、Google App Engine(GAE)のセッション間でString値を永続化するという目標を達成しました。これは、使用を簡素化することを目的としていますGAE上のデータストアの

ライブラリ自体は.jarファイルであり、EclipseのJavaプロジェクトに簡単に追加できます。私は使いやすいライブラリを使用していませんでした...主な問題は、保存したいデータをモデル化するクラスを登録することです。登録は一度しかできません!

public class MyListener implements ServletContextListener { 
    public void contextInitialized(ServletContextEvent event) { 

      // Register the Account class, only once! 
     ObjectifyService.register(Account.class); 

     Objectify ofy = ObjectifyService.begin(); 
     Account balances = null; 

      // Create the values we wish to persist. 
     balances = new Account(randomNum(), randomNum(), randomNum(), 
       randomNum()); 

      // Actually save the values. 
     ofy.put(balances); 
     assert balances.id != null; // id was autogenerated 
    } 

    public void contextDestroyed(ServletContextEvent event) { 
     // App Engine does not currently invoke this method. 
    } 

    private String randomNum() { 
     // Returns random number as a String 
    } 
} 

...このコードがのみ実行されます:私は客観化フレームワークを使用してクラスを登録しても4個の乱数を作成し、それらを保存した私のWebアプリにリスナーを追加だけ一度クラスを登録するには

サーバーの起動時に一回 - 私も追加するのweb.xmlを変更する場合は、必要に応じこれを実現するために:

0123:

<listener> 
     <listener-class>.MyListener</listener-class> 
    </listener> 

その後、私はちょうど保存された値を読み込むの.jspページを持っていましたここ

が私のアカウントクラスです:

import javax.persistence.*; 

public class Account 
{ 
    @Id String id = "mykey"; 
    public String balance1, balance2, balance3, balance4; 

    private Account() {} 

    public Account(String balance1, String balance2, String balance3, String balance4) 
    { 
     this.balance1 = balance1; 
     this.balance2 = balance2; 
     this.balance3 = balance3; 
     this.balance4 = balance4; 
    } 
} 

最後に一つ...私はGAEデータストアを理解する上でOBjectify documentationが非常に役に立ったにかかわらず、将来の参考のために客観化フレームワーク

+3

エンティティを置き換える前に削除する必要はありません。同じキーを入力すると、既存のエンティティが上書きされます。あなたのデータストア内の単一のグローバルレコードを更新しているようですが、競合に注意してください! –

+0

ルールを客観化しよう!誰もが、Jeffのドキュメントがデータストアを理解する上で最も優れていると言います。 – slugmandrew

答えて

0

の、私はあなたの元を考えますこれは、実際にentitを作成しません

balances = new Entity("Balances", primaryKey);

:例があるため、この行に失敗しましたy with primaryKey、ただし、祖先キーとしてprimaryKeyを持つエンティティを作成します。それはあなたがそれを格納するたびに自動的に生成されたIDを取得します。

関連する問題