私は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が非常に役に立ったにかかわらず、将来の参考のために客観化フレームワーク
エンティティを置き換える前に削除する必要はありません。同じキーを入力すると、既存のエンティティが上書きされます。あなたのデータストア内の単一のグローバルレコードを更新しているようですが、競合に注意してください! –
ルールを客観化しよう!誰もが、Jeffのドキュメントがデータストアを理解する上で最も優れていると言います。 – slugmandrew