2012-05-02 4 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

Вы пытаетесь использовать встроенную дорожку класса для хранения коллекции GeoPtr в UserTracks. Как DataStore справится с этим? При встраивании в UserTracks поля GeoPtr добавлены к общей одиночной записи в DataStore. Вы будете иметь:

avgSpeed, расстояние, ...., скорость, время

Что DataStore следует делать в случае сбора?

avgSpeed, расстояние, ...., speed_1, time_1, ..., speed_2, time_2, ... speed_N, time_N

???

Это ли какой-либо смысл?

Не используйте встроенные. Создайте три отдельных класса с первичными ключами. Используйте отношения «один-к-одному» для User-UserTracks и «один-ко-многим» для UserTracks - GeoPtr. Подробнее об отношениях here

+0

Встраивается поле коллекции. Я хотел, чтобы это поле было встроено, а не в разные таблицы. Я не хотел этого, чтобы я мог видеть их в средстве просмотра хранилища данных, он может хранить его как обычный объект для всех, что мне очень нравится. Спасибо в любом случае :) –

+0

Вы можете сделать его сериализуемым и написать в поле blob. Но может быть и другая проблема: размер ограничен с 1 МБ. Если ваша коллекция будет слишком большой - вы получите исключение – alexey28

0

Ну, видимо, есть какая-то проблема с вложением набор определенных пользователем классов. Я где-то читал, что его невозможно встроить в поле коллекции, в котором есть встроенное поле коллекции. Тем не менее, вы можете добиться почти того же путем сериализации этих полей (вы не сможете их индексировать - это разница между сериализованным и встроенным, но мне не нужны индексы в этих полях для моего использования, так что все получилось просто отлично) может сделать это, используя следующие обозначения: @Persistent (serialized = "true")

Надеялся, это спасет всех вас от боли, с которой я прошел.

Бар.