0

一部のフィールドがクラス自体であるクラスをGAEDBに格納しようとしています。詳細に入る直前に、これらの新しいクラスフィールドを追加する前に問題なく機能したと言いたいです。だから、私はここのドキュメントに従いました: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
    @EmbeddedOnly
    @SuppressWarnings("serial")
    public class GeoPtr implements Serializable 
    {

        /** the speed is in m/s **/
        @Persistent
        float speed;
        @Persistent
        long time;
        @Persistent
        double altitude;
        @Persistent
        double latitude;
        @Persistent
        double longitude;
        @Persistent
        double calorie = 0;

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

私が見る限り、すべてのクラスはPersistenceCapableであり、すべてのフィールドはPersistenceCapable自体またはそのコレクションのいずれかであり、上記のドキュメントによると機能するはずです。

アイデア?

ありがとう

4

2 に答える 2

0

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

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

コレクションの場合、データストアは何をすべきですか?

avgSpeed、distance、....、speed_1、time_1、...、speed_2、time_2、... speed_N、time_N

???

これは意味がありますか?

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

于 2012-05-04T06:54:51.503 に答える
0

どうやら、ユーザー定義クラスのコレクションを埋め込むことには問題があるようです。コレクションフィールド自体が埋め込まれているコレクションフィールドを埋め込むことはできないことをどこかで読んだことがあります。ただし、これらのフィールドをシリアル化することでほぼ同じことを実現できます(これらのフィールドにインデックスを付けることはできません。これは、シリアル化と埋め込みの違いですが、これらのフィールドにインデックスを付ける必要がないため、問題なく機能しました)。次の表記を使用してこれを行うことができます:@Persistent(serialized = "true")

それがあなた方全員に私が経験した苦痛を救うことを願っています。

バー。

于 2012-05-03T11:27:07.243 に答える