-2

今まで Objectify を使っていたのですが、JDO を使ってコードを扱う必要が出てきました。具体的には、Objectify で簡単にできる基本的なことで問題が発生しています。オブジェクトがメンバーとして List または配列のいずれかを持っている場合、それを保持できません。

FileInfoのリストを含むクラスFileInfoBatch(ここでコードのインデントが失われました、理由はわかりません)があります:

@PersistenceCapable
public class FileInfoBatch implements Serializable{

private static final long serialVersionUID = 1L;        
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;

@Persistent
private List<FileInfo> fileInfoList;    

@Persistent    
private String savedByUserEmail;

public FileInfoBatch(){         
    fileInfoList=new ArrayList<FileInfo>();     
}

次に、リストに 1 つの FileInfo のみを含む FileInfoBatch (fib と呼ばれる) を RPC impl クラスに送信して永続化し、テストのためにすぐにクエリを実行します (デバッガーで)。

    PersistenceManager pm = PMF.get().getPersistenceManager();
    pm.makePersistent(fib);
    Query query = pm.newQuery(FileInfoBatch.class, "savedByUserEmail == '"+ userEmail + "'");
    List<FileInfoBatch> savedList = (List<FileInfoBatch>) query.execute();
    FileInfoBatch persisted=savedList.get(0);

永続化された FileInfoBatch は、空の FileInfo リストで返されます。単一の Fileinfo メンバーを使用する場合、これは問題なく持続します。

このサイトではそのような基本的な問題は報告されていません。ドキュメントを確認しました: https://developers.google.com/appengine/docs/java/datastore/jdo/dataclasses

このような単純なストレージ タスクには、非常に複雑な作業が必要ですか? もしそうなら、Objectify の使用に戻ります。

4

1 に答える 1

0

「持続しない」を定義しますか?ログ(エンティティの PUT に何が含まれているかがわかります) またはDBビューアーで永続化されているものを確認しましたか? 「FileInfo」は PersistenceCapable としてマークされていますか?

おそらく永続化されますが、フェッチされるものを定義することに注意を払っていません (JDO では、取得したオブジェクトの内容を完全に制御できます)。http://www.datanucleus.org/products/accessplatform_3_1/jdo/object_lifecycle.html およびhttp://www.datanucleus.org/products/accessplatform_3_1/jdo/fetchgroup.htmlを読むことをお勧めします

「datanucleus-appengine」の最新バージョンを使用していますか? (つまり、v2.0 以降); 古いバージョンは努力する価値がありません。

PS、String、Key などのフィールド タイプに @Persistent は必要ありません。見た目がすっきりします。

FWIW : JDO は、他のオプションと同じくらい透過的であり、他のオプションよりも詳細に仕様によって定義されたセマンティクスを備えた単純な永続化の選択肢を提供します。

于 2012-10-28T16:24:44.103 に答える