2012-05-02 84 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 
    @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本身或它的集合,根據上面的文檔它應該可以工作。

想法?

謝謝

+0

「這意味着它或者沒有得到增強,或者文件的增強版本不在CLASSPATH中(或者被未增強版本隱藏),或者對於該數據的元數據/註釋沒有找到類。「所以那些適用哪一個......因爲其中一個確實如此。您可以輕鬆地檢查CLASSPATH中的內容,以及是否增強(javap告訴您類有哪些方法) – DataNucleus

回答

0

您嘗試使用嵌入類Track將GeoPtr的集合存儲到UserTracks。 DataStore如何處理它?嵌入到添加到DataStore中的公共單個記錄的GeoPtr的UserTracks字段中時。您將有:

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

應收集的情況下做些什麼數據存儲?

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

???

這是否有任何意義?

請勿使用嵌入式。使用主鍵創建三個獨立的類。使用User-UserTracks的一對一關係和UserTracks的一對多關係 - GeoPtr。 閱讀關於here

+0

可以嵌入收集字段。我想嵌入這個領域,而不是在不同的表格中。我不想要它,所以我可以在數據存儲區查看器中看到它們,它可以像普通對象一樣容納它,我感謝所有關心。謝謝:) –

+0

您可以使其可序列化並寫入blob字段。但可能還有其他問題:大小限制爲1MB。如果你的收藏太大 - 你會得到一個例外 – alexey28

0

很明顯,嵌入用戶定義類的集合存在一些問題。 我讀過的地方,它不可能嵌入一個集合領域,它有一個嵌入式收藏領域本身。但是,你可以通過序列化這些字段來獲得幾乎相同的結果(你不能爲它們編制索引 - 這就是序列化到嵌入的區別,但我不需要在這些字段上使用索引,所以它工作得很好)你可以通過使用下面的表示法來實現: @Persistent(serialized =「true」)

希望它能夠拯救你們所有人的痛苦。

酒吧。