2012-05-02 5 views
0

私はいくつかのフィールドがクラスそのものであるクラスをGAE DBに格納しようとしています。 詳細に進む前に、私はこれらの新しいクラスフィールドを追加する前にうまくいきました。 だから、私はここにドキュメントを追っ:https://developers.google.com/appengine/docs/java/datastore/jdo/dataclasses と、私はこのエラーを取得しています:クラスは持続性ではありませんか?

org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException:クラス「クラス 『sporteam.web.client.User』をされてこれは、拡張されていないか、拡張バージョンのファイルがCLASSPATHにない(拡張されていないバージョンによって隠されている)か、クラスのメタデータ/注釈が見つからないことを意味します。持続可能ではありません。これは、拡張されていないか、拡張バージョンのファイルがCLASSPATHにない(拡張されていないバージョンで隠されている)か、クラスのメタデータが見つからないことを意味します。

私が使用しようとしている主なクラスがユーザーである:

@SuppressWarnings("serial") 
@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class User implements Serializable 
{ 
    // data members 

    // user unique facebook id 
    @Persistent 
    @PrimaryKey 
    private String facebook_id; 

    // users facebook code 
    @Persistent 
    private String facebook_code; 

    // users device ID code 
    @Persistent 
    private String dev_id; 

    // users registration ID code 
    @Persistent 
    private String reg_id; 

    // user first name 
    @Persistent 
    private String first_name; 

    // user last name 
    @Persistent 
    private String last_name; 

    // user age, should be grater then 8 
    @Persistent 
    private int age; 

    // user email, as setup in facebook 
    @Persistent 
    private String email; 

    // user weight, should be greater then 40 
    @Persistent 
    private double weight; 

    // user workout_level (0.8 is the highest(best shape) and 1 is the lowest) 
    @Persistent 
    private double workout_level; 

    // user gender ("male"/"female"/"unknown") 
    @Persistent 
    private String gender; 
    @Persistent 
    @Embedded 
    private UserTracks userTracks = null; 

    // default constructor 
    public User() 
    { 
    } 
    //.... 
} 

これはUserTracksクラスです:

@PersistenceCapable 
    @EmbeddedOnly 
    @SuppressWarnings("serial") 
    public class UserTracks implements Serializable 
    { 
     @Persistent 
     @Embedded 
     //@Element(embedded="true") 
     private List<Track> tracks = null; 
     @Persistent 
     private long date = 0; 

     public UserTracks() 
     { 
     } 
    } 

そして論文を使用し、他の2クラスであります

@PersistenceCapable 
    @EmbeddedOnly 
    @SuppressWarnings("serial") 
    public class Track implements Serializable 
    { 

     /** running information **/ 
     @Persistent 
     private double avgSpeed = 0; 
     @Persistent 
     private double distance = 0; 
     @Persistent 
     private double calories = 0; 
     @Persistent 
     private long time = 0; 

     /************************/ 
     @Persistent 
     private long date = 0; 
     @Persistent 
     private String name = null; 
     @Persistent 
     @Embedded 
     private List<GeoPtr> track = null; 

     public Track() 
     { // needed for Serializable 
     } 
    } 

GeoPtr:

すべてのクラスはPersistenceCapableであり、すべてのフィールドはPersistenceCapable自身またはそのコレクションであり、上のドキュメントに従って動作するはずです。

アイデア?

おかげ

+0

"これは拡張されていないか、またはファイルの拡張バージョンがCLASSPATHにない(拡張されていないバージョンによって隠されている)、またはメタデータ/アノテーションがクラスが見つかりません。そのうちのどれが当てはまるのでしょうか? CLASSPATHにあるものと、拡張されているかどうかを簡単に確認できます(javapはクラスのメソッドを教えてくれます) – DataNucleus

答えて

0

埋め込みクラスのトラックを使用して、GeoPtrのコレクションをUserTracksに格納しようとしています。データストアがそれをどのように処理するのか? DataStoreの一般的な単一レコードに追加されたGeoPtrのUserTracksフィールドに埋め込むとき。あなたは持っています:

avgSpeed、距離、....、速度、時間

コレクションケースにどのようなデータストアをすればよいですか?

avgSpeed、距離、...、speed_1、TIME_1、...、speed_2、time_2、... speed_N、time_N

???

これは何ですか?

埋め込みを使用しないでください。主キーで3つの別々のクラスを作成します。 User - UserTracksとUserTracks - GeoPtrの1対多の関係を使用します。 関係について読むhere

+0

コレクションフィールドを埋め込むことは可能です。このフィールドは埋め込まれていて、別のテーブルには入れられませんでした。私はそれを望んでいないので、データストアのビューアでそれらを見ることができます。それは、私が気にしているすべてのもののために通常のオブジェクトのように保持できます。ありがとうとにかく:) –

+0

あなたはそれを直列化してblobフィールドに書き込むことができます。しかし、他にも問題があります。サイズは1MBの制限です。コレクションが大きすぎる場合は、例外が発生します – alexey28

0

まあ明らかに、ユーザー定義のクラスのコレクションを埋め込むことで、いくつかの問題があります。 私は、コレクションフィールド自体が埋め込まれているコレクションフィールドを埋め込むことができないと読んだことがあります。しかし、これらのフィールドをシリアライズすることで、ほぼ同じ結果を得ることができます(インデックス化することはできません - シリアル化と埋め込みの違いですが、私はこれらのフィールドにインデックスを付ける必要はありません) @Persistent(シリアライズ= "true")

あなたは皆さんの苦痛を救ってくれるでしょう。

バー。

関連する問題